/ Hex Artifact Content
Login

Artifact 6783ed3936bc484c2252523c82e9a14888fed936:


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 70 20 3f 20 70 2d 3e    return p ? p->
0740: 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zSql : 0;.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d   assert( pA->db=
07e0: 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70  =pB->db );.  tmp
07f0: 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20   = *pA;.  *pA = 
0800: 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70  *pB;.  *pB = tmp
0810: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
0820: 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78  Next;.  pA->pNex
0830: 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20  t = pB->pNext;. 
0840: 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d   pB->pNext = pTm
0850: 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e  p;.  pTmp = pA->
0860: 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72  pPrev;.  pA->pPr
0870: 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a  ev = pB->pPrev;.
0880: 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54    pB->pPrev = pT
0890: 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d  mp;.  zTmp = pA-
08a0: 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71  >zSql;.  pA->zSq
08b0: 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20  l = pB->zSql;.  
08c0: 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b  pB->zSql = zTmp;
08d0: 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65  .  pB->isPrepare
08e0: 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61  V2 = pA->isPrepa
08f0: 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  reV2;.}../*.** R
0900: 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61  esize the Vdbe.a
0910: 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  Op array so that
0920: 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20   it is at least 
0930: 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c 61 72  nOp elements lar
0940: 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 74 73  ger .** than its
0950: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e 20 6e   current size. n
0960: 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  Op is guaranteed
0970: 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
0980: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
0990: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 2e  1024/sizeof(Op).
09a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
09b0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
09c0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
09d0: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
09e0: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
09f0: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0a00: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0a10: 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 6c 6c  and Parse.nOpAll
0a20: 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e  oc remain .** un
0a30: 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73  changed (this is
0a40: 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63   so that any opc
0a50: 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  odes already all
0a60: 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a  ocated can be .*
0a70: 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c  * correctly deal
0a80: 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
0a90: 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  th the rest of t
0aa0: 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61  he Vdbe)..*/.sta
0ab0: 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72  tic int growOpAr
0ac0: 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ray(Vdbe *v, int
0ad0: 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f 70 20   nOp){.  VdbeOp 
0ae0: 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a  *pNew;.  Parse *
0af0: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 0a  p = v->pParse;..
0b00: 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
0b10: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
0b20: 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ESS compile-time
0b30: 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 69 67   option is desig
0b40: 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 20 2a  ned to force.  *
0b50: 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e 74 20  * more frequent 
0b60: 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 65 6e  reallocs and hen
0b70: 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 65 20  ce provide more 
0b80: 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 66 6f  opportunities fo
0b90: 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 74 65  r .  ** simulate
0ba0: 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 20 53  d OOM faults.  S
0bb0: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0bc0: 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 65 6e  OC_STRESS is gen
0bd0: 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 2a 2a  erally used.  **
0be0: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
0bf0: 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 4c 49  only.  With SQLI
0c00: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0c10: 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 65 20  STRESS grow the 
0c20: 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 62 79  op array.  ** by
0c30: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d   the minimum* am
0c40: 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 75 6e  ount required un
0c50: 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 65 61  til the size rea
0c60: 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 6d 61  ches 512.  Norma
0c70: 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  l.  ** operation
0c80: 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 54 45   (without SQLITE
0c90: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
0ca0: 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f 75 62  RESS) is to doub
0cb0: 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  le the current. 
0cc0: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
0cd0: 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 64 20  op array or add 
0ce0: 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 77 68  1KB of space, wh
0cf0: 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
0d00: 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  er. */.#ifdef SQ
0d10: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0d20: 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 20 6e  C_STRESS.  int n
0d30: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0d40: 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e 4f 70  oc>=512 ? p->nOp
0d50: 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70  Alloc*2 : p->nOp
0d60: 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73  Alloc+nOp);.#els
0d70: 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28  e.  int nNew = (
0d80: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
0d90: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69  >nOpAlloc*2 : (i
0da0: 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28  nt)(1024/sizeof(
0db0: 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Op)));.  UNUSED_
0dc0: 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b 0a  PARAMETER(nOp);.
0dd0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
0de0: 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a  ( nOp<=(1024/siz
0df0: 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73  eof(Op)) );.  as
0e00: 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e  sert( nNew>=(p->
0e10: 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b  nOpAlloc+nOp) );
0e20: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0e30: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0e40: 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , v->aOp, nNew*s
0e50: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0e60: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0e70: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0e80: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0e90: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0ea0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0eb0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0ec0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0ed0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0ee0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 23  ITE_NOMEM);.}..#
0ef0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0f00: 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  UG./* This routi
0f10: 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ne is just a con
0f20: 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
0f30: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
0f40: 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66  t that will.** f
0f50: 69 72 65 20 61 66 74 65 72 20 65 61 63 68 20 6f  ire after each o
0f60: 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65  pcode is inserte
0f70: 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20  d and displayed 
0f80: 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41  using.** "PRAGMA
0f90: 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65   vdbe_addoptrace
0fa0: 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  =on"..*/.static 
0fb0: 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f  void test_addop_
0fc0: 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29  breakpoint(void)
0fd0: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e  {.  static int n
0fe0: 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23   = 0;.  n++;.}.#
0ff0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
1000: 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69   a new instructi
1010: 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  on to the list o
1020: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63  f instructions c
1030: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a  urrent in the.**
1040: 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74   VDBE.  Return t
1050: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1060: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
1070: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  n..**.** Paramet
1080: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20  ers:.**.**    p 
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f                Po
10a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42  inter to the VDB
10b0: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20  E.**.**    op   
10c0: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f             The o
10d0: 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69  pcode for this i
10e0: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a  nstruction.**.**
10f0: 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20      p1, p2, p3  
1100: 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a      Operands.**.
1110: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
1120: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1130: 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  el() function to
1140: 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 20   fix an address 
1150: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  and.** the sqlit
1160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
1170: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61   function to cha
1180: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
1190: 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61   the P4.** opera
11a0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  nd..*/.static SQ
11b0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
11c0: 74 20 67 72 6f 77 4f 70 33 28 56 64 62 65 20 2a  t growOp3(Vdbe *
11d0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
11e0: 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70  1, int p2, int p
11f0: 33 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  3){.  assert( p-
1200: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1210: 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  c<=p->nOp );.  i
1220: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
1230: 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 1) ) return 1;
1240: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1250: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70  arse->nOpAlloc>p
1260: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72  ->nOp );.  retur
1270: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1280: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
1290: 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71  2, p3);.}.int sq
12a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
12c0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c   int p1, int p2,
12d0: 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20   int p3){.  int 
12e0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
12f0: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
1300: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1310: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1320: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
1330: 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66  ( op>0 && op<0xf
1340: 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  f );.  if( p->pP
1350: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
1360: 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  i ){.    return 
1370: 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70  growOp3(p, op, p
1380: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a  1, p2, p3);.  }.
1390: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f    p->nOp++;.  pO
13a0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
13b0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
13c0: 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70  (u8)op;.  pOp->p
13d0: 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31  5 = 0;.  pOp->p1
13e0: 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32   = p1;.  pOp->p2
13f0: 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33   = p2;.  pOp->p3
1400: 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34   = p3;.  pOp->p4
1410: 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  .p = 0;.  pOp->p
1420: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
1430: 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ED;.#ifdef SQLIT
1440: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
1450: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d  _COMMENTS.  pOp-
1460: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
1470: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1480: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1490: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
14a0: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
14b0: 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
14c0: 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73  jj, kk;.    Pars
14d0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
14e0: 50 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a  Parse;.    for(j
14f0: 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54  j=kk=0; jj<SQLIT
1500: 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a  E_N_COLCACHE; jj
1510: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1520: 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d  t yColCache *x =
1530: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1540: 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69  he + jj;.      i
1550: 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  f( x->iLevel>pPa
1560: 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1570: 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29   || x->iReg==0 )
1580: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1590: 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d   printf(" r[%d]=
15a0: 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65  {%d:%d}", x->iRe
15b0: 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d  g, x->iTable, x-
15c0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
15d0: 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20   kk++;.    }.   
15e0: 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66   if( kk ) printf
15f0: 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  ("\n");.    sqli
1600: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
1610: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
1620: 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70  ;.    test_addop
1630: 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
1640: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1650: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
1660: 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b  pOp->cycles = 0;
1670: 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b  .  pOp->cnt = 0;
1680: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1690: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
16a0: 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c  AGE.  pOp->iSrcL
16b0: 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ine = 0;.#endif.
16c0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
16d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
16e0: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
16f0: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1710: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1720: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1730: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1740: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1750: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1770: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
1780: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1790: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
17a0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17b0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
17c0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
17d0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
17e0: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47   p2, 0);.}../* G
17f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1800: 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1810: 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  l jump to instru
1820: 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69  ction iDest.*/.i
1830: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  nt sqlite3VdbeGo
1840: 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  to(Vdbe *p, int 
1850: 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75 72 6e  iDest){.  return
1860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1870: 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p3(p, OP_Goto, 0
1880: 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a  , iDest, 0);.}..
1890: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18a0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 73 74   to cause the st
18b0: 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62 65 20  ring zStr to be 
18c0: 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72  loaded into.** r
18d0: 65 67 69 73 74 65 72 20 69 44 65 73 74 0a 2a 2f  egister iDest.*/
18e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
18f0: 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62 65 20  LoadString(Vdbe 
1900: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63  *p, int iDest, c
1910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29  onst char *zStr)
1920: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1930: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
1940: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1950: 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30  Dest, 0, zStr, 0
1960: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1970: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 69  rate code that i
1980: 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69  nitializes multi
1990: 70 6c 65 20 72 65 67 69 73 74 65 72 73 20 74 6f  ple registers to
19a0: 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65 67   string or integ
19b0: 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  er.** constants.
19c0: 20 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20    The registers 
19d0: 62 65 67 69 6e 20 77 69 74 68 20 69 44 65 73 74  begin with iDest
19e0: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 63 6f   and increase co
19f0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20  nsecutively..** 
1a00: 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69 73 20  One register is 
1a10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20  initialized for 
1a20: 65 61 63 68 20 63 68 61 72 61 63 67 74 65 72 20  each characgter 
1a30: 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f  in zTypes[].  Fo
1a40: 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20 63 68  r each.** "s" ch
1a50: 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79 70 65  aracter in zType
1a60: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1a70: 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 66  r is a string if
1a80: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1a90: 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72  .** not NULL, or
1aa0: 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20   OP_Null if the 
1ab0: 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c 6c 20  value is a null 
1ac0: 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20 65 61  pointer.  For ea
1ad0: 63 68 20 22 69 22 20 63 68 61 72 61 63 74 65 72  ch "i" character
1ae0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  .** in zTypes[],
1af0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1b00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1b10: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76  an integer..*/.v
1b20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b30: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b40: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b50: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b60: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1b70: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1b80: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1b90: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1bb0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1bd0: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1be0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1bf0: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c00: 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
1c10: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1c20: 62 65 41 64 64 4f 70 32 28 70 2c 20 7a 3d 3d 30  beAddOp2(p, z==0
1c30: 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
1c40: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1c50: 74 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t++);.      if( 
1c60: 7a 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  z ) sqlite3VdbeC
1c70: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1c80: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   z, 0);.    }els
1c90: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1ca0: 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20 20 20 20   c=='i' );.     
1cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc0: 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(p, OP_Integer
1cd0: 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  , va_arg(ap, int
1ce0: 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20  ), iDest++);.   
1cf0: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
1d00: 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ap);.}../*.** Ad
1d10: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1d20: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1d30: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
1d40: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
1d60: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1d70: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1d80: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1d90: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1db0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1dc0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1de0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1df0: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1e00: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1e10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e30: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e50: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
1e60: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e70: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1e80: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1e90: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1ea0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1eb0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1ec0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1ed0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1ee0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1ef0: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1f00: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1f10: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1f20: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1f30: 68 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68  he p4 value with
1f40: 20 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a   a P4_INT64 or.*
1f50: 2a 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a  * P4_REAL type..
1f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1f70: 62 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20  beAddOp4Dup8(.  
1f80: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
1f90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
1fa0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
1fb0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fd0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1fe0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1ff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
2000: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2010: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
2020: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
2030: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
2040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2050: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
2060: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c    const u8 *zP4,
2070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
2080: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2090: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
20a0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
20b0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ype */.){.  char
20c0: 20 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74   *p4copy = sqlit
20d0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
20e0: 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20  lite3VdbeDb(p), 
20f0: 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79  8);.  if( p4copy
2100: 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79   ) memcpy(p4copy
2110: 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74  , zP4, 8);.  ret
2120: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
2130: 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp4(p, op, p1,
2140: 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c   p2, p3, p4copy,
2150: 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a   p4type);.}../*.
2160: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2170: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2180: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2190: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
21a0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
21b0: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
21c0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
21d0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
21e0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
21f0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2210: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2220: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2230: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2240: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2250: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2260: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2270: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2280: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2290: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
22a0: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
22b0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
22c0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
22d0: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
22e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22f0: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
2300: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
2310: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2320: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
2330: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2340: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2350: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2360: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2370: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2380: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2390: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
23a0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
23b0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
23c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
23d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
23e0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
23f0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2400: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2410: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2420: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2430: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2440: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2450: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2460: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2470: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2480: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2490: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
24a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24b0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
24c0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
24d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
24e0: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
24f0: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
2500: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2510: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
2520: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
2530: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2540: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
2550: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
2560: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
2570: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2580: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2590: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
25a0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
25b0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
25c0: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
25d0: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
25e0: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
25f0: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
2600: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
2610: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
2620: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
2630: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
2640: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
2650: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
2660: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
2670: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
2680: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
2690: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
26a0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
26b0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
26c0: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
26d0: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
26e0: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
26f0: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
2700: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
2710: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
2720: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2730: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
2740: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
2750: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
2760: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
2770: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
2780: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
2790: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
27a0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
27b0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
27c0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
27d0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
27e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
27f0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
2800: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2810: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
2820: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
2830: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
2840: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
2850: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2860: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2870: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
2880: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
2890: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
28a0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
28b0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
28c0: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
28f0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
2900: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
2910: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
2920: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
2930: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
2940: 72 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a  return ADDR(i);.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
2960: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
2970: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2980: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2990: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
29a0: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
29b0: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
29c0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
29d0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
29e0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
29f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2a00: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2a10: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2a20: 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  el(Vdbe *v, int 
2a30: 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  x){.  Parse *p =
2a40: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2a50: 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20  t j = ADDR(x);. 
2a60: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
2a70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2a80: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
2a90: 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
2aa0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b   assert( j>=0 );
2ab0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
2ac0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2ad0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
2ae0: 20 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70   }.  p->iFixedOp
2af0: 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d   = v->nOp - 1;.}
2b00: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
2b10: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2b20: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2b30: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2b40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2b50: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2b60: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2b70: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
2b80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2b90: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
2ba0: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
2bb0: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
2bc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
2bd0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
2be0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
2bf0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
2c00: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
2c10: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
2c20: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
2c30: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
2c40: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
2c50: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2c60: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2c70: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2c80: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2c90: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2ca0: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2cb0: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
2cc0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2cd0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2ce0: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
2cf0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2d10: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
2d20: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
2d30: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2d40: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
2d50: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2d60: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2d70: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2d80: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2d90: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2da0: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2db0: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
2dc0: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
2dd0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
2de0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2e00: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
2e10: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
2e20: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
2e30: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
2e40: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2e50: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2e60: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2e90: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2ea0: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2ec0: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
2ed0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
2ee0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
2ef0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
2f00: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
2f10: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
2f20: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
2f30: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
2f40: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
2f50: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2f60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2f70: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2f80: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2f90: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2fa0: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2fb0: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
2fc0: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
2fd0: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
2fe0: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
2ff0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
3000: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
3010: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
3020: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
3030: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
3040: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
3050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
3060: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
3070: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
3080: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
3090: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
30a0: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
30b0: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
30c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
30d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
30e0: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
30f0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
3100: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
3110: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
3120: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
3130: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
3140: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
3150: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
3160: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
3170: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
3180: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
3190: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
31a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
31b0: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
31c0: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
31d0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
31e0: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
31f0: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
3200: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
3210: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
3220: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
3230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3240: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
3250: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
3260: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
3270: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3280: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3290: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
32a0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
32b0: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
32c0: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
32d0: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
32e0: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
32f0: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
3300: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
3310: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
3320: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
3330: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
3340: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
3350: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
3360: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
3370: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
3380: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
3390: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
33a0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
33b0: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
33c0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
33d0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
33e0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
33f0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
3400: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
3410: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
3420: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
3430: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
3440: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
3450: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
3460: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
3470: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
3480: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
3490: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
34a0: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
34b0: 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f  reateTable and O
34c0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
34d0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
34e0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
34f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
3500: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
3510: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
3520: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
3530: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
3540: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
3550: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
3560: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
3570: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
3580: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
3590: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
35a0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
35b0: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
35c0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
35d0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
35e0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
35f0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
3600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
3610: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3620: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
3630: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
3640: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
3650: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3660: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
3670: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
3680: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
3690: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
36a0: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
36b0: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
36c0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
36d0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
36e0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
36f0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
3700: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
3710: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
3720: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
3730: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
3740: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3750: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
3760: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
3770: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
3780: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
3790: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
37a0: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
37b0: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
37c0: 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f   .     || ((opco
37d0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
37e0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
37f0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
3800: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
3810: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3820: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
3830: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
3840: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
3850: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
3860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3870: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
3880: 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61  eTable ) hasCrea
3890: 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  teTable = 1;.   
38a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
38b0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
38c0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
38d0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
38e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
38f0: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
3900: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
3910: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
3920: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
3930: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
3940: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
3950: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
3960: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
3970: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
3980: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
3990: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
39a0: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
39b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
39c0: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
39d0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
39e0: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
39f0: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
3a00: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
3a10: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
3a20: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
3a30: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
3a40: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
3a50: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
3a60: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
3a70: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
3a80: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
3a90: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
3aa0: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
3ab0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
3ac0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3ad0: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
3ae0: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
3af0: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
3b00: 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72         || (hasCr
3b10: 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73  eateTable && has
3b20: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29  InitCoroutine) )
3b30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3b40: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
3b50: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
3b60: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
3b70: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n */../*.** This
3b80: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3b90: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ed after all opc
3ba0: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
3bb0: 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f  nserted.  It loo
3bc0: 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  ps.** through al
3bd0: 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e  l the opcodes an
3be0: 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20  d fixes up some 
3bf0: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28  details..**.** (
3c00: 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70  1) For each jump
3c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
3c20: 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  h a negative P2 
3c30: 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a  value (a label).
3c40: 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74  **     resolve t
3c50: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61  he P2 value to a
3c60: 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73  n actual address
3c70: 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70  ..**.** (2) Comp
3c80: 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ute the maximum 
3c90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
3ca0: 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20  nts used by any 
3cb0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
3cc0: 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68      and store th
3cd0: 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61  at value in *pMa
3ce0: 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a  xFuncArgs..**.**
3cf0: 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20   (3) Update the 
3d00: 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e  Vdbe.readOnly an
3d10: 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72  d Vdbe.bIsReader
3d20: 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61   flags to accura
3d30: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69  tely.**     indi
3d40: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72  cate what the pr
3d50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
3d60: 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a   actually does..
3d70: 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61  **.** (4) Initia
3d80: 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76  lize the p4.xAdv
3d90: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  ance pointer on 
3da0: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65  opcodes that use
3db0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52   it..**.** (5) R
3dc0: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
3dd0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
3de0: 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a  storing labels..
3df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3e00: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3e10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
3e20: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
3e30: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
3e40: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
3e50: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
3e60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3e70: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
3e80: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
3e90: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
3ea0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
3eb0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
3ec0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
3ed0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3ee0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3ef0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3f00: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3f10: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
3f20: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
3f30: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
3f40: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
3f50: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
3f60: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
3f70: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
3f80: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
3f90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
3fa0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
3fb0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
3fc0: 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c  !=0 ) p->readOnl
3fd0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  y = 0;.        /
3fe0: 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * fall thru */. 
3ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4000: 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a  e OP_AutoCommit:
4010: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53  .      case OP_S
4020: 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20  avepoint: {.    
4030: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
4040: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
4050: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
4060: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4070: 5f 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20  _WAL.      case 
4080: 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23  OP_Checkpoint:.#
4090: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
40a0: 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20   OP_Vacuum:.    
40b0: 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61    case OP_Journa
40c0: 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  lMode: {.       
40d0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
40e0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73  ;.        p->bIs
40f0: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4110: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4120: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4130: 42 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BLE.      case O
4140: 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20  P_VUpdate: {.   
4150: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
4160: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
4170: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
4180: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
41a0: 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a  e OP_VFilter: {.
41b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
41c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
41d0: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
41e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
41f0: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
4200: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
4210: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
4220: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
4230: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
4240: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20   nMaxArgs = n;. 
4250: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4260: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4270: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a     case OP_Next:
4280: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  .      case OP_N
4290: 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20  extIfOpen:.     
42a0: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
42b0: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ext: {.        p
42c0: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
42d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
42e0: 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  xt;.        pOp-
42f0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4300: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72  ANCE;.        br
4310: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4320: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
4330: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50  .      case OP_P
4340: 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20  revIfOpen: {.   
4350: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64       pOp->p4.xAd
4360: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42  vance = sqlite3B
4370: 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20  treePrevious;.  
4380: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4390: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
43a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
43b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
43c0: 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d    pOp->opflags =
43d0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
43e0: 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a  operty[opcode];.
43f0: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
4400: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55  flags & OPFLG_JU
4410: 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70  MP)!=0 && pOp->p
4420: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  2<0 ){.      ass
4430: 65 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70  ert( ADDR(pOp->p
4440: 32 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  2)<pParse->nLabe
4450: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
4460: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52  p2 = aLabel[ADDR
4470: 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20  (pOp->p2)];.    
4480: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
4490: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61  bFree(p->db, pPa
44a0: 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  rse->aLabel);.  
44b0: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d  pParse->aLabel =
44c0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c   0;.  pParse->nL
44d0: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61  abel = 0;.  *pMa
44e0: 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78  xFuncArgs = nMax
44f0: 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20  Args;.  assert( 
4500: 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20  p->bIsReader!=0 
4510: 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  || DbMaskAllZero
4520: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
4530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4540: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
4550: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
4560: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
4570: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
4580: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4590: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
45a0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
45b0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
45c0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
45d0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
45e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
45f0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
4600: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
4610: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
4620: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
4630: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
4640: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4650: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
4660: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
4670: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
4680: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
4690: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
46a0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
46b0: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
46c0: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
46d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
46e0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
46f0: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
4700: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4710: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
4720: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
4730: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
4740: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
4750: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
4760: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
4770: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
4780: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
4790: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
47a0: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
47b0: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
47c0: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
47d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
47e0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
47f0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
4800: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
4810: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
4820: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
4830: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
4840: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4850: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
4860: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
4870: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
4880: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
4890: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
48a0: 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a  sert( DbMaskAllZ
48b0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
48c0: 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
48d0: 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78  2Values(p, pnMax
48e0: 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20  Arg);.  *pnOp = 
48f0: 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70  p->nOp;.  p->aOp
4900: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61   = 0;.  return a
4910: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
4920: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
4930: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
4940: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
4950: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
4960: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
4970: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
4980: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
4990: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
49a0: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
49b0: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
49c0: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e  t const *aOp, in
49d0: 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e  t iLineno){.  in
49e0: 74 20 61 64 64 72 2c 20 69 3b 0a 20 20 56 64 62  t addr, i;.  Vdb
49f0: 65 4f 70 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73  eOp *pOut;.  ass
4a00: 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20  ert( nOp>0 );.  
4a10: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4a20: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4a30: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  T );.  if( p->nO
4a40: 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61  p + nOp > p->pPa
4a50: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  rse->nOpAlloc &&
4a60: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
4a70: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
4a80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
4a90: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 4f 75   = p->nOp;.  pOu
4aa0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  t = &p->aOp[addr
4ab0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
4ac0: 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c  nOp; i++, aOp++,
4ad0: 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f   pOut++){.    pO
4ae0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70  ut->opcode = aOp
4af0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f  ->opcode;.    pO
4b00: 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31  ut->p1 = aOp->p1
4b10: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d  ;.    pOut->p2 =
4b20: 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73   aOp->p2;.    as
4b30: 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30  sert( aOp->p2>=0
4b40: 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33   );.    pOut->p3
4b50: 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = aOp->p3;.    
4b60: 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50  pOut->p4type = P
4b70: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70  4_NOTUSED;.    p
4b80: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
4b90: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
4ba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4bb0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4bc0: 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d  MMENTS.    pOut-
4bd0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
4be0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4bf0: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
4c00: 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63  E.    pOut->iSrc
4c10: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
4c20: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69  ;.#else.    (voi
4c30: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
4c40: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4c50: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d  DEBUG.    if( p-
4c60: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4c70: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
4c80: 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ce ){.      sqli
4c90: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
4ca0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
4cb0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
4cc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
4cd0: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4ce0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
4cf0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4d00: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
4d10: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
4d20: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4d30: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
4d40: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
4d50: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
4d60: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
4d70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4d80: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
4d90: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4db0: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
4dc0: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
4dd0: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
4e00: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
4e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
4e20: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4e30: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4e40: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
4e50: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
4e60: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
4e70: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4e80: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
4e90: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
4ea0: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ec0: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
4ed0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
4ee0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4ef0: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
4f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4f10: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
4f20: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
4f30: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
4f40: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
4f50: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
4f60: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
4f70: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
4f80: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
4f90: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
4fa0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
4fb0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
4fc0: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
4fd0: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
4fe0: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
4ff0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
5000: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
5010: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
5020: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
5030: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
5040: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
5050: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
5060: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
5070: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
5080: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
5090: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
50a0: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
50b0: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
50c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
50d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
50e0: 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50  opcode, or P1, P
50f0: 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65  2, P3, or P5 ope
5100: 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73  rands.** for a s
5110: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
5120: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
5130: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
5140: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33  code(Vdbe *p, u3
5150: 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f  2 addr, u8 iNewO
5160: 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65  pcode){.  sqlite
5170: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5180: 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65  r)->opcode = iNe
5190: 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20  wOpcode;.}.void 
51a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
51b0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
51c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
51d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
51e0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20  tOp(p,addr)->p1 
51f0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
5200: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5210: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
5220: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5230: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5240: 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20  p(p,addr)->p2 = 
5250: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5260: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
5270: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5280: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5290: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
52a0: 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61  p,addr)->p3 = va
52b0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
52c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
52d0: 62 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20  be *p, u8 p5){. 
52e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
52f0: 70 28 70 2c 2d 31 29 2d 3e 70 35 20 3d 20 70 35  p(p,-1)->p5 = p5
5300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
5310: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
5320: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
5330: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
5340: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
5350: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5360: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5370: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
5380: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5390: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
53a0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
53b0: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
53c0: 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  dOp = p->nOp - 1
53d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
53e0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
53f0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
5400: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5410: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5420: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5430: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
5440: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
5450: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
5460: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
5470: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5480: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
5490: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
54a0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
54b0: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
54c0: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
54d0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
54e0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
54f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
5500: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5510: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
5520: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5530: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5540: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
5550: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
5560: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
5570: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
5580: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
5590: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
55a0: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
55b0: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
55c0: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
55d0: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
55e0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
55f0: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
5600: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
5610: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
5620: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5630: 2a 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20  *)p4)->pFunc);. 
5640: 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74         /* Fall t
5650: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
5660: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
5670: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5680: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
5690: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
56a0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
56b0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
56c0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
56d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
56e0: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
56f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5700: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5710: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
5720: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
5730: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
5740: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
5750: 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34  ref((KeyInfo*)p4
5760: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5770: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
5780: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
5790: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
57a0: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
57b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
57c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57d0: 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20  (Expr*)p4);.    
57e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
57f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
5800: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
5810: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5820: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5830: 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  =0 ) sqlite3_fre
5840: 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  e(p4);.        b
5850: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5860: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
5870: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
5880: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5890: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
58a0: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  f*)p4);.        
58b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
58c0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
58d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
58e0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
58f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5900: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
5910: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
5920: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  *)p4);.        }
5930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5940: 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70  Mem *p = (Mem*)p
5950: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  4;.          if(
5960: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
5970: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5980: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
59a0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
59b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
59c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
59d0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
59e0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
59f0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
5a00: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
5a10: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
5a20: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
5a30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5a50: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
5a60: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
5a70: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
5a80: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
5a90: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
5aa0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
5ab0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
5ac0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
5ad0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
5ae0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
5af0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
5b00: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
5b10: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
5b20: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
5b30: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
5b40: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
5b50: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
5b60: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
5b70: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
5b80: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
5b90: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
5ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5bb0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
5bc0: 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NTS.      sqlite
5bd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
5be0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
5bf0: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
5c00: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
5c10: 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f  e(db, aOp);.}../
5c20: 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75  *.** Link the Su
5c30: 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20  bProgram object 
5c40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
5c50: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e  cond argument in
5c60: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a  to the linked.**
5c70: 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53   list at Vdbe.pS
5c80: 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20  ubProgram. This 
5c90: 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  list is used to 
5ca0: 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70  delete all sub-p
5cb0: 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74  rogram.** object
5cc0: 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73  s when the VM is
5cd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
5ce0: 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  red..*/.void sql
5cf0: 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50  ite3VdbeLinkSubP
5d00: 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64  rogram(Vdbe *pVd
5d10: 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  be, SubProgram *
5d20: 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  p){.  p->pNext =
5d30: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
5d40: 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  ;.  pVdbe->pProg
5d50: 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ram = p;.}../*.*
5d60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63  * Change the opc
5d70: 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f  ode at addr into
5d80: 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64   OP_Noop.*/.void
5d90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5da0: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
5db0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69  , int addr){.  i
5dc0: 66 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  f( addr<p->nOp )
5dd0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
5de0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5df0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
5e00: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
5e10: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5e20: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5e30: 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  p);.    memset(p
5e40: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
5e50: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d  p[0]));.    pOp-
5e60: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
5e70: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
5e80: 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  If the last opco
5e90: 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69  de is "op" and i
5ea0: 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20  t is not a jump 
5eb0: 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20  destination,.** 
5ec0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20  then remove it. 
5ed0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
5ee0: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f  and only if an o
5ef0: 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65  pcode was remove
5f00: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5f10: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
5f20: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
5f30: 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70  u8 op){.  if( (p
5f40: 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61  ->nOp-1)>(p->pPa
5f50: 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26  rse->iFixedOp) &
5f60: 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  & p->aOp[p->nOp-
5f70: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b  1].opcode==op ){
5f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5f90: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20  ChangeToNoop(p, 
5fa0: 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72  p->nOp-1);.    r
5fb0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5fc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
5fe0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
5ff0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
6000: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
6010: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
6020: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6030: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
6040: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
6050: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
6060: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
6070: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
6080: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
6090: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
60a0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
60b0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
60c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
60d0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
60e0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
60f0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
6100: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
6110: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
6120: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
6130: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
6140: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
6150: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
6160: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
6170: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
6180: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
6190: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
61a0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
61b0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
61c0: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
61d0: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
61e0: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
61f0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
6200: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
6210: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
6220: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
6230: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
6240: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
6250: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
6260: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
6270: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
6280: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
6290: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
62a0: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
62b0: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
62c0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
62d0: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
62e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
62f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
6300: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6310: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
6320: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
6330: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
6340: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
6350: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
6360: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
6370: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6380: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
6390: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
63a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
63b0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34  ){.    if( n!=P4
63c0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66  _VTAB ){.      f
63d0: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
63e0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
63f0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
6400: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
6410: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
6420: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
6430: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
6440: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
6450: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
6460: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
6470: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73  aOp[addr];.  ass
6480: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
6490: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20  ==P4_NOTUSED.   
64a0: 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79      || pOp->p4ty
64b0: 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20  pe==P4_INT32.   
64c0: 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79      || pOp->p4ty
64d0: 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29  pe==P4_KEYINFO )
64e0: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
64f0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
6500: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
6510: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
6520: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
6530: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
6540: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
6550: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
6560: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
6570: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
6580: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
6590: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
65a0: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
65b0: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
65c0: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
65d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
65e0: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
65f0: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
6600: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
6610: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6620: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
6630: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
6640: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
6650: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
6660: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
6670: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
6680: 49 4e 46 4f 3b 0a 23 69 66 64 65 66 20 53 51 4c  INFO;.#ifdef SQL
6690: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
66a0: 52 5f 48 49 4e 54 53 0a 20 20 7d 65 6c 73 65 20  R_HINTS.  }else 
66b0: 69 66 28 20 6e 3d 3d 50 34 5f 45 58 50 52 20 29  if( n==P4_EXPR )
66c0: 7b 0a 20 20 20 20 2f 2a 20 52 65 73 70 6f 6e 73  {.    /* Respons
66d0: 69 62 69 6c 69 74 79 20 66 6f 72 20 64 65 6c 65  ibility for dele
66e0: 74 69 6e 67 20 74 68 65 20 45 78 70 72 20 74 72  ting the Expr tr
66f0: 65 65 20 69 73 20 68 61 6e 64 65 64 20 6f 76 65  ee is handed ove
6700: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
6710: 56 44 42 45 20 62 79 20 74 68 69 73 20 6f 70 65  VDBE by this ope
6720: 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c  ration.  The cal
6730: 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ler should have 
6740: 61 6c 72 65 61 64 79 20 69 6e 76 6f 6b 65 64 0a  already invoked.
6750: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
6760: 70 72 44 75 70 28 29 20 6f 72 20 77 68 61 74 65  prDup() or whate
6770: 76 65 72 20 6f 74 68 65 72 20 72 6f 75 74 69 6e  ver other routin
6780: 65 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  e is needed to m
6790: 61 6b 65 20 61 20 0a 20 20 20 20 2a 2a 20 70 72  ake a .    ** pr
67a0: 69 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68  ivate copy of th
67b0: 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 70  e tree. */.    p
67c0: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 20 3d 20 28  Op->p4.pExpr = (
67d0: 45 78 70 72 2a 29 7a 50 34 3b 0a 20 20 20 20 70  Expr*)zP4;.    p
67e0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
67f0: 45 58 50 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EXPR;.#endif.  }
6800: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
6810: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
6820: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
6830: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
6840: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
6850: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
6860: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
6870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
6880: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
6890: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
68a0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
68b0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
68c0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
68d0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
68e0: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
6900: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
6910: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
6920: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
6930: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
6940: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
6950: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
6960: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
6970: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
6980: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
6990: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
69a0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
69b0: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
69c0: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
69d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
69e0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
69f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
6a00: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
6a10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6a20: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
6a30: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
6a40: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
6a50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a60: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
6a70: 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
6a80: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
6a90: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
6ab0: 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66  KEYINFO);.}..#if
6ac0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6ad0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6ae0: 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  TS./*.** Change 
6af0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
6b00: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
6b10: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
6b20: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
6b30: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
6b40: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
6b50: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
6b60: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
6b70: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
6b80: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
6b90: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
6ba0: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
6bb0: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
6bc0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
6bd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
6be0: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65  dbeVComment(Vdbe
6bf0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
6c00: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
6c10: 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t ap){.  assert(
6c20: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
6c30: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
6c40: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
6c50: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
6c60: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
6c70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6c80: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
6c90: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >nOp ){.    asse
6ca0: 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20  rt( p->aOp );.  
6cb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6cc0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d  p->db, p->aOp[p-
6cd0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
6ce0: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
6cf0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
6d00: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
6d10: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
6d20: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  t, ap);.  }.}.vo
6d30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
6d40: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
6d50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6d60: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
6d70: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
6d80: 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  ){.    va_start(
6d90: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
6da0: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
6db0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6dc0: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
6dd0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6de0: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e  e3VdbeNoopCommen
6df0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
6e00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6e10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
6e20: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
6e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6e40: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
6e50: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
6e60: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
6e70: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
6e80: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6e90: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
6ea0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
6eb0: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
6ec0: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
6ed0: 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74  VERAGE./*.** Set
6ee0: 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68   the value if th
6ef0: 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64  e iSrcLine field
6f00: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6f10: 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  sly coded instru
6f20: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
6f30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e  qlite3VdbeSetLin
6f40: 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c  eNumber(Vdbe *v,
6f50: 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73   int iLine){.  s
6f60: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
6f70: 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20  v,-1)->iSrcLine 
6f80: 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69  = iLine;.}.#endi
6f90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45  f /* SQLITE_VDBE
6fa0: 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a  _COVERAGE */../*
6fb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
6fc0: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
6fd0: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
6fe0: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
6ff0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
7000: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7010: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
7020: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
7030: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7040: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
7050: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
7060: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
7070: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
7080: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7090: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
70a0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
70b0: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
70c0: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
70d0: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
70e0: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
70f0: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
7100: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
7110: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
7120: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
7130: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
7140: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
7150: 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75  after an OOM fau
7160: 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  lt without havin
7170: 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  g to check to se
7180: 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20  e if the return 
7190: 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f  from .** this ro
71a0: 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64  utine is a valid
71b0: 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62   pointer.  But b
71c0: 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79  ecause the dummy
71d0: 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a  .opcode is 0,.**
71e0: 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65   dummy will neve
71f0: 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  r be written to.
7200: 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69    This is verifi
7210: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65  ed by code inspe
7220: 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20  ction and.** by 
7230: 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c  running with Val
7240: 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70  grind..*/.VdbeOp
7250: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
7260: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
7270: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
7280: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
7290: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
72a0: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
72b0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
72c0: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
72d0: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
72e0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
72f0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
7300: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
7310: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
7320: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
7330: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
7340: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
7350: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
7360: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
7370: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
7380: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
7390: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
73a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
73b0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
73c0: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
73d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
73e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
73f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7400: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
7410: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
7420: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
7430: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
7440: 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
7450: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
7460: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
7470: 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  )./*.** Return a
7480: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n integer value 
7490: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70  for one of the p
74a0: 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65  arameters to the
74b0: 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64   opcode pOp.** d
74c0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61  etermined by cha
74d0: 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61  racter c..*/.sta
74e0: 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74  tic int translat
74f0: 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74  eP(char c, const
7500: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28   Op *pOp){.  if(
7510: 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e   c=='1' ) return
7520: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20   pOp->p1;.  if( 
7530: 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20  c=='2' ) return 
7540: 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63  pOp->p2;.  if( c
7550: 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70  =='3' ) return p
7560: 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d  Op->p3;.  if( c=
7570: 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='4' ) return pO
7580: 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72  p->p4.i;.  retur
7590: 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a  n pOp->p5;.}../*
75a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
75b0: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f  ring for the "co
75c0: 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20  mment" field of 
75d0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69  a VDBE opcode li
75e0: 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sting..**.** The
75f0: 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64   Synopsis: field
7600: 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   in comments in 
7610: 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63  the vdbe.c sourc
7620: 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76  e file gets conv
7630: 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65  erted.** to an e
7640: 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74  xtra string that
7650: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
7660: 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  the sqlite3Opcod
7670: 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65  eName().  In the
7680: 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f  .** absence of o
7690: 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74  ther comments, t
76a0: 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63  his synopsis bec
76b0: 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74  omes the comment
76c0: 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a   on the opcode..
76d0: 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74  ** Some translat
76e0: 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a  ion occurs:.**.*
76f0: 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20  *       "PX"    
7700: 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20    ->  "r[X]".** 
7710: 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20        "PX@PY"   
7720: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d  ->  "r[X..X+Y-1]
7730: 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20  "  or "r[x]" if 
7740: 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20  y is 0 or 1.**  
7750: 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d       "PX@PY+1" -
7760: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20  >  "r[X..X+Y]"  
7770: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7780: 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22   is 0.**       "
7790: 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b  PY..PY"  ->  "r[
77a0: 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22  X..Y]"      or "
77b0: 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f  r[x]" if y<=x.*/
77c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
77d0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f  layComment(.  co
77e0: 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20  nst Op *pOp,    
77f0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74   /* The opcode t
7800: 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a  o be commented *
7810: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7820: 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f  zP4,   /* Previo
7830: 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61  usly obtained va
7840: 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20  lue for P4 */.  
7850: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20  char *zTemp,    
7860: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
7870: 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  lt here */.  int
7880: 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20   nTemp          
7890: 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62  /* Space availab
78a0: 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f  le in zTemp[] */
78b0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
78c0: 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e   *zOpName;.  con
78d0: 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73  st char *zSynops
78e0: 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d  is;.  int nOpNam
78f0: 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  e;.  int ii, jj;
7900: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
7910: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
7920: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
7930: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
7940: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
7950: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
7960: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
7970: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
7980: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
7990: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
79a0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
79b0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28  me + 1;.    for(
79c0: 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d  ii=jj=0; jj<nTem
79d0: 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e  p-1 && (c = zSyn
79e0: 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69  opsis[ii])!=0; i
79f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7a00: 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20  c=='P' ){.      
7a10: 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b    c = zSynopsis[
7a20: 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ++ii];.        i
7a30: 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20  f( c=='4' ){.   
7a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7a50: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7a60: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
7a70: 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20  , zP4);.        
7a80: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27  }else if( c=='X'
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7aa0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7ab0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7ac0: 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  j, "%s", pOp->zC
7ad0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  omment);.       
7ae0: 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a     seenCom = 1;.
7af0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7b00: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20           int v1 
7b10: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20  = translateP(c, 
7b20: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
7b30: 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20  int v2;.        
7b40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b50: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7b60: 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29  mp+jj, "%d", v1)
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7b80: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7b90: 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29  s+ii+1, "@P", 2)
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7bb0: 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20     ii += 3;.    
7bc0: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7bd0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7be0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20  emp+jj);.       
7bf0: 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c       v2 = transl
7c00: 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69  ateP(zSynopsis[i
7c10: 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  i], pOp);.      
7c20: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
7c30: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
7c40: 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"+1",2)==0 ){. 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20               ii 
7c60: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
7c70: 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20      v2++;.      
7c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7c90: 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a      if( v2>1 ){.
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
7cb0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7cc0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7cd0: 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32  j, "..%d", v1+v2
7ce0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
7cf0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
7d00: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
7d10: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7d20: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20  ..P3", 4)==0 && 
7d30: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20  pOp->p3==0 ){.  
7d40: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7d50: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
7d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d70: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7d80: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7d90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7da0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b         zTemp[jj+
7db0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
7dc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
7dd0: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65  eenCom && jj<nTe
7de0: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f  mp-5 && pOp->zCo
7df0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  mment ){.      s
7e00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7e10: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
7e20: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d  jj, "; %s", pOp-
7e30: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
7e40: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
7e50: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
7e60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7e70: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d   jj<nTemp ) zTem
7e80: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  p[jj] = 0;.  }el
7e90: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d  se if( pOp->zCom
7ea0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
7eb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7ec0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c  mp, zTemp, "%s",
7ed0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7ee0: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65  .    jj = sqlite
7ef0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
7f00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
7f10: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
7f20: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   jj = 0;.  }.  r
7f30: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64  eturn jj;.}.#end
7f40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
7f50: 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f  UG */..#if VDBE_
7f60: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
7f70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7f80: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
7f90: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  )./*.** Translat
7fa0: 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76  e the P4.pExpr v
7fb0: 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43  alue for an OP_C
7fc0: 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65  ursorHint opcode
7fd0: 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68   into text.** th
7fe0: 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61  at can be displa
7ff0: 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f  yed in the P4 co
8000: 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20  lumn of EXPLAIN 
8010: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
8020: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 50 34 45  c int displayP4E
8030: 78 70 72 28 69 6e 74 20 6e 54 65 6d 70 2c 20 63  xpr(int nTemp, c
8040: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 45 78 70 72  har *zTemp, Expr
8050: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73   *pExpr){.  cons
8060: 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b  t char *zOp = 0;
8070: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 77 69 74  .  int n;.  swit
8080: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8090: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
80a0: 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ING:.      sqlit
80b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
80c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 51 22 2c 20  p, zTemp, "%Q", 
80d0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
80e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
80f0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
8100: 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ER:.      sqlite
8110: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8120: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
8130: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
8140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8150: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
8160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8170: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8180: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
8190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
81a0: 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
81b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
81c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
81d0: 20 7a 54 65 6d 70 2c 20 22 72 5b 25 64 5d 22 2c   zTemp, "r[%d]",
81e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
81f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8200: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8210: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
8220: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
8230: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
8240: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8250: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8260: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
8270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8280: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8290: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 25  Temp, zTemp, "c%
82a0: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
82b0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
82c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
82d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
82e0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
82f0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
8300: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
8310: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
8320: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8330: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
8340: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
8350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8360: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
8370: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
8380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8390: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
83a0: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
83b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
83c0: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
83d0: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
83e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
83f0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
8400: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
8410: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
8420: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
8430: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
8440: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
8450: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
8460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8470: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
8480: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
8490: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
84a0: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
84b0: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
84c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
84d0: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
84e0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
84f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
8500: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
8510: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8520: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
8530: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
8540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8550: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
8560: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
8570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8580: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
8590: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
85a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
85b0: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
85c0: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
85d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
85e0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
85f0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
8600: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
8610: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
8620: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
8630: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
8640: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
8650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8660: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
8670: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
8680: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8690: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
86a0: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
86b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
86c0: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
86d0: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
86e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
86f0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
8700: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8710: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
8720: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
8730: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8740: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
8750: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
8760: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
8770: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
8780: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8790: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
87a0: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
87b0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
87c0: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
87d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
87e0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 22  mp, zTemp, "%s("
87f0: 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 6e 20 3d 20  , zOp);.    n = 
8800: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8810: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 6e 20 2b 3d  zTemp);.    n +=
8820: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e   displayP4Expr(n
8830: 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c  Temp-n, zTemp+n,
8840: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8850: 20 20 20 20 69 66 28 20 6e 3c 6e 54 65 6d 70 2d      if( n<nTemp-
8860: 31 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  1 && pExpr->pRig
8870: 68 74 20 29 7b 0a 20 20 20 20 20 20 7a 54 65 6d  ht ){.      zTem
8880: 70 5b 6e 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[n++] = ',';.  
8890: 20 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79      n += display
88a0: 50 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20  P4Expr(nTemp-n, 
88b0: 7a 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e  zTemp+n, pExpr->
88c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
88d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
88e0: 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65  ntf(nTemp-n, zTe
88f0: 6d 70 2b 6e 2c 20 22 29 22 29 3b 0a 20 20 7d 0a  mp+n, ")");.  }.
8900: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8910: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
8920: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
8930: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
8940: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8950: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8960: 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42  TS) */...#if VDB
8970: 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a  E_DISPLAY_P4./*.
8980: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
8990: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
89a0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
89b0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
89c0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
89d0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
89e0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
89f0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
8a00: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
8a10: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
8a20: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
8a30: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
8a40: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
8a50: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
8a60: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
8a70: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
8a80: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
8a90: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
8aa0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
8ab0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
8ac0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
8ad0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
8ae0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
8af0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
8b00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8b10: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64  mp, zTemp, "k(%d
8b20: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
8b30: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
8b40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8b50: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
8b60: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
8b70: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
8b80: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
8b90: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
8ba0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
8bb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8bc0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
8bd0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
8be0: 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20   "nil";.        
8bf0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
8c00: 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a  trlen30(zColl);.
8c10: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36          if( n==6
8c20: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c   && memcmp(zColl
8c30: 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20  ,"BINARY",6)==0 
8c40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
8c50: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
8c60: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
8c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8c80: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37 20 29 7b 0a   i+n>nTemp-7 ){.
8c90: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
8ca0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
8cb0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
8cc0: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
8cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8ce0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
8cf0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
8d00: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
8d10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
8d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
8d30: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
8d40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d50: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
8d60: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
8d70: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
8d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
8d90: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
8da0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
8db0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
8dc0: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
8dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8de0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8df0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8e00: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
8e10: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73  XPR: {.      dis
8e20: 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70  playP4Expr(nTemp
8e30: 2c 20 7a 54 65 6d 70 2c 20 70 4f 70 2d 3e 70 34  , zTemp, pOp->p4
8e40: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  .pExpr);.      b
8e50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8e60: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43  if.    case P4_C
8e70: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
8e80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8e90: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
8ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8eb0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8ec0: 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  emp, "(%.20s)", 
8ed0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
8ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ef0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
8f00: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
8f10: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
8f20: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
8f30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8f40: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8f50: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
8f60: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
8f70: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
8f80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
8f90: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8fa0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
8fb0: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
8fc0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
8fd0: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
8fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8ff0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
9000: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
9010: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
9020: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
9030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9040: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
9050: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
9060: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9070: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
9080: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
9090: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
90a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
90b0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
90c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
90d0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
90e0: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
90f0: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
9100: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9110: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
9120: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9130: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
9140: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
9150: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
9160: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9170: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
9180: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
9190: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
91a0: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
91b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
91c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
91d0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
91e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
91f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
9200: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9210: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9220: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
9230: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
9240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9250: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9260: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
9270: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9280: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9290: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
92a0: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
92b0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
92c0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
92d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
92e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
92f0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
9300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9310: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
9320: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
9330: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
9340: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
9350: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9360: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
9370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9380: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
9390: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
93a0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
93b0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
93c0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
93d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
93e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
93f0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  mp, "vtab:%p", p
9400: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
9410: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9420: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9430: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
9440: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9450: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
9460: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
9470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9480: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
9490: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
94a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
94b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
94c0: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
94d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
94e0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
94f0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
9500: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
9510: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
9520: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
9530: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
9540: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
9550: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9560: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
9570: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
9580: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9590: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
95a0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
95b0: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
95c0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
95d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
95e0: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
95f0: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
9600: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
9610: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
9620: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
9630: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
9640: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
9650: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
9660: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
9670: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
9680: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
9690: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
96a0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
96b0: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
96c0: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
96d0: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
96e0: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
96f0: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
9700: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
9710: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
9720: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
9730: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
9740: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
9750: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
9760: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
9770: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
9780: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
9790: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
97a0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
97b0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
97c0: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
97d0: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
97e0: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
97f0: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
9800: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
9810: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
9820: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
9830: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
9840: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9860: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
9870: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
9880: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
9890: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
98a0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
98b0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
98c0: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
98d0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
98e0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
98f0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
9900: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9910: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
9920: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
9930: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
9940: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
9950: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
9960: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
9970: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
9980: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
9990: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
99a0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
99b0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
99c0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
99d0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
99e0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
99f0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
9a00: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
9a10: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
9a20: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
9a30: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
9a40: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
9a50: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
9a60: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
9a70: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
9a80: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
9a90: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
9aa0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
9ab0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9ac0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
9ad0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
9ae0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
9af0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
9b00: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
9b10: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
9b20: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
9b30: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
9b40: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
9b50: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
9b60: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
9b70: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
9b80: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
9b90: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
9ba0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
9bb0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
9bc0: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
9bd0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
9be0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
9bf0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
9c00: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
9c10: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
9c20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9c30: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
9c40: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
9c50: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
9c60: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
9c70: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
9c80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
9c90: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
9ca0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
9cb0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
9cc0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
9cd0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
9ce0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
9cf0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
9d00: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
9d10: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
9d20: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
9d30: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
9d40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
9d50: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
9d60: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
9d70: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
9d80: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
9d90: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
9da0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
9db0: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
9dc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9dd0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9de0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9df0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
9e00: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
9e10: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
9e20: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
9e30: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
9e40: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
9e50: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
9e60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
9e70: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
9e80: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
9e90: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
9ea0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
9eb0: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
9ec0: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
9ed0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
9ee0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
9ef0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
9f00: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
9f10: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
9f20: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
9f30: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
9f40: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
9f50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9f60: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
9f70: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
9f80: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
9f90: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
9fa0: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
9fb0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
9fc0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
9fd0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
9fe0: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
9ff0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
a000: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
a010: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
a020: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
a030: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
a040: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
a050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a060: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
a070: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
a080: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
a090: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
a0a0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
a0b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
a0c0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
a0d0: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
a0e0: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
a0f0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
a100: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
a110: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
a120: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
a130: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
a140: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
a150: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
a160: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
a170: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
a180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
a190: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
a1a0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
a1b0: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
a1c0: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
a1d0: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
a1e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  ;.#endif.  /* NB
a1f0: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
a200: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
a210: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
a220: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
a230: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
a240: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
a250: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
a260: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
a270: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
a280: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
a290: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
a2a0: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
a2b0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
a2c0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
a2d0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a2e0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
a2f0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
a300: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
a310: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
a320: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
a330: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
a340: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
a350: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
a360: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
a370: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a380: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
a390: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
a3a0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
a3b0: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
a3c0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
a3d0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
a3e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
a3f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a400: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
a410: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
a420: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
a430: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
a440: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
a450: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
a460: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
a470: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
a480: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
a490: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
a4a0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
a4b0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
a4c0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
a4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a4e0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
a4f0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
a500: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
a510: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
a520: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
a530: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
a540: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
a550: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
a560: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
a570: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
a580: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
a590: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
a5a0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
a5b0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
a5c0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
a5d0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
a5e0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
a5f0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
a600: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
a610: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
a620: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
a630: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
a640: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
a650: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
a660: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
a670: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
a680: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
a690: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
a6a0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
a6b0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
a6c0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
a6d0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
a6e0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
a6f0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
a700: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
a710: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
a720: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
a730: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
a740: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
a750: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
a760: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
a770: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
a780: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
a790: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
a7a0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
a7b0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
a7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
a7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
a7e0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
a7f0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
a800: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a810: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
a820: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a830: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a840: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
a850: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
a860: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
a870: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
a880: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
a890: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
a8a0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
a8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a8c0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
a8d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
a8e0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
a8f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a900: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
a910: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
a920: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
a930: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
a940: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
a950: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
a960: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
a970: 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  d );.    db->mal
a980: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
a990: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
a9a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
a9b0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a9c0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
a9d0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
a9e0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
a9f0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
aa00: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
aa10: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
aa20: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
aa30: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
aa40: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
aa50: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
aa60: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
aa70: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
aa80: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
aa90: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
aaa0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
aab0: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
aac0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
aad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
aae0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
aaf0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
ab00: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
ab10: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
ab20: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
ab30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
ab40: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
ab50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ab60: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
ab70: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
ab80: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
ab90: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
aba0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
abb0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
abc0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
abd0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
abe0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
abf0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
ac00: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
ac10: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
ac20: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
ac30: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
ac40: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
ac50: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
ac60: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
ac70: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
ac80: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
ac90: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
aca0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
acb0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
acc0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
acd0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
ace0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
acf0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
ad00: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
ad10: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
ad20: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
ad30: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
ad40: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
ad50: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
ad60: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
ad70: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
ad80: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
ad90: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
ada0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
adb0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
adc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
add0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
ae00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ae30: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
ae40: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
ae50: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
ae60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ae70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ae80: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
ae90: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
aea0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
aeb0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
aec0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
aed0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
aee0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
af10: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
af20: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
af30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
af40: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
af50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
af60: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
af70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
afa0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
afb0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
afc0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
afd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
afe0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
aff0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
b000: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
b010: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
b020: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
b030: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
b040: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
b050: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b060: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
b070: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
b080: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b090: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
b0a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b0b0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
b0c0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
b0d0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
b0e0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
b0f0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
b100: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
b110: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
b120: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
b130: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
b140: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b150: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
b160: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
b170: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
b180: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
b190: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
b1a0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
b1b0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
b1c0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b1d0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
b1e0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
b1f0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
b200: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
b210: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
b220: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
b230: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b240: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
b250: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
b260: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
b270: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
b290: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
b2a0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
b2b0: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
b2c0: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
b2d0: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
b2e0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
b2f0: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
b300: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
b310: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
b320: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
b330: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
b340: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
b350: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
b360: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b370: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
b380: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b390: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
b3a0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
b3b0: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
b3c0: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
b3d0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b3e0: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
b3f0: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
b400: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
b410: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
b420: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
b430: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
b440: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
b450: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
b460: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
b470: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
b480: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
b490: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
b4a0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
b4b0: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
b4c0: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
b4d0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
b4e0: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
b4f0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b500: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
b510: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
b520: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
b530: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
b540: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
b550: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
b560: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
b570: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
b580: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
b590: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
b5a0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
b5b0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
b5c0: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
b5d0: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
b5e0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
b5f0: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
b600: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
b610: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
b620: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
b630: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
b640: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
b650: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
b660: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
b670: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
b680: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
b690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
b6a0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
b6b0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
b6c0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
b6d0: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
b6e0: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
b6f0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
b700: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
b710: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
b720: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
b730: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b740: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
b750: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
b760: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
b770: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
b780: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b790: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
b7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
b7b0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  R;.    sqlite3Vd
b7c0: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
b7d0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
b7e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
b7f0: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
b800: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
b810: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
b820: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
b830: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
b840: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
b850: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
b860: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
b870: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
b880: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
b890: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
b8a0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
b8b0: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
b8c0: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
b8d0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
b8e0: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
b8f0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
b900: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
b910: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
b920: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
b930: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
b940: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
b950: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
b960: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
b970: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
b980: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
b990: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
b9a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
b9b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
b9c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
b9d0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
b9e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
ba20: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
ba30: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
ba40: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ba50: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
ba60: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
ba70: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
ba80: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
ba90: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
baa0: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
bab0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
bac0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
bad0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
bae0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
baf0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
bb00: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
bb10: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
bb20: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
bb30: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
bb40: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
bb50: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
bb60: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
bb70: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
bb80: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
bb90: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
bba0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
bbb0: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
bbc0: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
bbd0: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
bbe0: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
bbf0: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
bc00: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
bc10: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
bc20: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
bc30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
bc40: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
bc50: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
bc60: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
bc70: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
bc80: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
bc90: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
bca0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
bcb0: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
bcc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
bcd0: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
bce0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
bcf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bd00: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
bd10: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
bd20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
bd30: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
bd40: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
bd50: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
bd60: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
bd70: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
bd80: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
bd90: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
bda0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
bdb0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
bdc0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
bdd0: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
bde0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
bdf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
be00: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
be10: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
be20: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
be30: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
be60: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
be70: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
be80: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
be90: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
bec0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
bed0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
bee0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
bef0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
bf00: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf20: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
bf30: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
bf40: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
bf50: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
bf60: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
bf70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
bf80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bf90: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
bfa0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bfb0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
bfc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
bfd0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34  EM_Term;.    zP4
bfe0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
bff0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
c000: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
c010: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
c020: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c030: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
c040: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
c050: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
c060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c070: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
c080: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
c090: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
c0a0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
c0b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c0c0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c0d0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
c0e0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
c0f0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
c100: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
c110: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
c120: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
c130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c140: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c150: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c160: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c180: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c190: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c1a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c1b0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
c1c0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
c1d0: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
c1e0: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
c1f0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
c200: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c210: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c220: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
c230: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
c240: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
c250: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c260: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
c270: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
c280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c290: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c2a0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c2c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c2d0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c2e0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c2f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c300: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
c310: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
c320: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
c330: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
c340: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
c350: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c360: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
c390: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
c3a0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
c3b0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
c3c0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
c3d0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
c3e0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
c3f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c400: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
c410: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
c420: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c430: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c440: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
c450: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
c460: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
c470: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
c480: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
c490: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
c4a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c4b0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
c4c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c4d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
c4e0: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
c4f0: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
c500: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
c510: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
c520: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
c530: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
c540: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
c550: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
c560: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
c570: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
c580: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
c590: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
c5a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c5b0: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
c5c0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
c5d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
c5e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c5f0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
c600: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c610: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
c620: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
c630: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
c640: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
c650: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c660: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
c670: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
c680: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
c690: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
c6a0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
c6b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
c6c0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
c6d0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
c6e0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
c6f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c700: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c710: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
c720: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
c730: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c740: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c750: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
c760: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
c770: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
c780: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
c790: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
c7a0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
c7b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
c7c0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
c7d0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
c7e0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
c7f0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
c800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c820: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
c830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c840: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
c850: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
c860: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
c870: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
c880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
c890: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
c8a0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
c8b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
c8c0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
c8d0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
c8e0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
c8f0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
c900: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
c910: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
c920: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
c930: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
c940: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
c950: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
c960: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
c970: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
c980: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
c990: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
c9a0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
c9b0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
c9c0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
c9d0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
c9e0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
c9f0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
ca00: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
ca10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
ca20: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
ca30: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
ca40: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
ca50: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
ca60: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
ca70: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
ca80: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
ca90: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
caa0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
cab0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
cac0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
cad0: 2e 0a 2a 2a 0a 2a 2a 20 70 46 72 6f 6d 20 70 6f  ..**.** pFrom po
cae0: 69 6e 74 73 20 74 6f 20 2a 70 6e 46 72 6f 6d 20  ints to *pnFrom 
caf0: 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
cb00: 6c 65 20 73 70 61 63 65 2e 20 20 4e 65 77 20 73  le space.  New s
cb10: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
cb20: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e  d.** from the en
cb30: 64 20 6f 66 20 74 68 65 20 70 46 72 6f 6d 20 62  d of the pFrom b
cb40: 75 66 66 65 72 20 61 6e 64 20 2a 70 6e 46 72 6f  uffer and *pnFro
cb50: 6d 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  m is decremented
cb60: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 4e 65 65 64 65  ..**.** *pnNeede
cb70: 64 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  d is a counter o
cb80: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
cb90: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
cba0: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
cbb0: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
cbc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
cbd0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
cbe0: 69 6e 20 70 46 72 6f 6d 20 74 6f 20 73 61 74 69  in pFrom to sati
cbf0: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
cc00: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
cc10: 6e 74 20 2a 70 6e 4e 65 65 64 65 64 20 62 79 20  nt *pnNeeded by 
cc20: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
cc30: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
cc40: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
cc50: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
cc60: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
cc70: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
cc80: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
cc90: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
cca0: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
ccb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ccc0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
ccd0: 0a 20 20 75 38 20 2a 70 46 72 6f 6d 2c 20 20 20  .  u8 *pFrom,   
cce0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
ccf0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
cd00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
cd10: 69 6e 74 20 2a 70 6e 46 72 6f 6d 2c 20 20 20 20  int *pnFrom,    
cd20: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
cd30: 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
cd40: 61 74 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 69 6e  at pFrom */.  in
cd50: 74 20 2a 70 6e 4e 65 65 64 65 64 20 20 20 20 20  t *pnNeeded     
cd60: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
cd70: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
cd80: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
cd90: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
cda0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
cdb0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 46 72 6f 6d  _ALIGNMENT(pFrom
cdc0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
cdd0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
cde0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
cdf0: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
ce00: 3d 20 2a 70 6e 46 72 6f 6d 20 29 7b 0a 20 20 20  = *pnFrom ){.   
ce10: 20 20 20 2a 70 6e 46 72 6f 6d 20 2d 3d 20 6e 42     *pnFrom -= nB
ce20: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
ce30: 3d 20 26 70 46 72 6f 6d 5b 2a 70 6e 46 72 6f 6d  = &pFrom[*pnFrom
ce40: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
ce50: 20 20 20 20 2a 70 6e 4e 65 65 64 65 64 20 2b 3d      *pnNeeded +=
ce60: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
ce70: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
ce80: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ce90: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
cea0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
ceb0: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
cec0: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
ced0: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
cee0: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
cef0: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
cf00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
cf10: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
cf20: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
cf30: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
cf40: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
cf50: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
cf60: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
cf70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cf80: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
cf90: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
cfa0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
cfb0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
cfc0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
cfd0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
cfe0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
cff0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
d000: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
d010: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
d020: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
d030: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
d040: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d050: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
d060: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
d070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d080: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
d090: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
d0a0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
d0b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d0c0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
d0d0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
d0e0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d0f0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
d100: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
d110: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
d120: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
d130: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
d140: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
d150: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
d160: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
d170: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
d180: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
d190: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d1a0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
d1b0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
d1c0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
d1d0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d1e0: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
d1f0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
d200: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
d210: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
d220: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
d230: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d240: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
d250: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
d260: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
d270: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
d280: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
d290: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
d2a0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
d2b0: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
d2c0: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
d2d0: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
d2e0: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
d2f0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d300: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
d310: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
d320: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
d330: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
d340: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
d350: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d360: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
d370: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
d380: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
d390: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
d3a0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d3b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
d3c0: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
d3d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
d3e0: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
d3f0: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
d400: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
d410: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
d420: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
d430: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
d440: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
d450: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
d460: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
d470: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
d480: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
d490: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
d4a0: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
d4b0: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
d4c0: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
d4d0: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
d4e0: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
d4f0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
d500: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
d510: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
d520: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
d530: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d540: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
d550: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d580: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d5b0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
d5c0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
d5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d5e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d5f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
d600: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
d610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d620: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
d630: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d660: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
d670: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
d680: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
d690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d6a0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
d6b0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
d6c0: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d6e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d6f0: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
d700: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
d710: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d720: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d730: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
d740: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
d750: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d770: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d780: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 66 72   /* Available fr
d7b0: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 75 38  ee space */.  u8
d7c0: 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20   *zCsr;         
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7e0: 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  Memory available
d7f0: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
d800: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
d830: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
d840: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
d850: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
d860: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
d870: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
d880: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
d890: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
d8a0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
d8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
d8c0: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
d8d0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
d8e0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
d8f0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
d900: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
d910: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
d920: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
d930: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
d940: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
d950: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
d960: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
d970: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
d980: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
d990: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
d9a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
d9b0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
d9c0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
d9d0: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
d9e0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
d9f0: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
da00: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
da10: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
da20: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
da30: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
da40: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
da50: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
da60: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
da70: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
da80: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
da90: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
daa0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
dab0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
dac0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
dad0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
dae0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
daf0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
db00: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
db10: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
db20: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
db30: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
db40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
db50: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
db60: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
db70: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
db80: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
db90: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
dba0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
dbb0: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
dbc0: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
dbd0: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
dbe0: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
dbf0: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
dc00: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
dc10: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
dc20: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
dc30: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
dc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
dc50: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
dc60: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
dc70: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
dc80: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
dc90: 66 28 4f 70 29 20 3c 3d 20 30 78 37 66 66 66 66  f(Op) <= 0x7ffff
dca0: 66 30 30 20 29 3b 0a 20 20 6e 46 72 65 65 20 3d  f00 );.  nFree =
dcb0: 20 28 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c   (pParse->nOpAll
dcc0: 6f 63 20 2d 20 70 2d 3e 6e 4f 70 29 2a 73 69 7a  oc - p->nOp)*siz
dcd0: 65 6f 66 28 70 2d 3e 61 4f 70 5b 30 5d 29 3b 20  eof(p->aOp[0]); 
dce0: 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 70 61  /* Available spa
dcf0: 63 65 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  ce */..  resolve
dd00: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
dd10: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
dd20: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
dd30: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
dd40: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
dd50: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
dd60: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
dd70: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
dd80: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
dd90: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
dda0: 20 30 2c 20 6e 46 72 65 65 29 3b 0a 20 20 61 73   0, nFree);.  as
ddb0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
ddc0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 7a 43 73 72  _ALIGNMENT(&zCsr
ddd0: 5b 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20 70 2d  [nFree]) );.  p-
dde0: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
ddf0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
de00: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
de10: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
de20: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
de30: 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  in two.  ** pass
de40: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
de50: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
de60: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73  o reuse unused s
de70: 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a  pace at the .  *
de80: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
de90: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
dea0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
deb0: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
dec0: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
ded0: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
dee0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
def0: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
df00: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
df10: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
df20: 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66  e rest using a f
df30: 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  resh allocation.
df40: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
df50: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
df60: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
df70: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
df80: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
df90: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
dfa0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
dfb0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
dfc0: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
dfd0: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
dfe0: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
dff0: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
e000: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
e010: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
e020: 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  o {.    nByte = 
e030: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  0;.    p->aMem =
e040: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
e050: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
e060: 28 4d 65 6d 29 2c 20 7a 43 73 72 2c 20 26 6e 46  (Mem), zCsr, &nF
e070: 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  ree, &nByte);.  
e080: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
e090: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
e0a0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
e0b0: 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20  , zCsr, &nFree, 
e0c0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
e0d0: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
e0e0: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  ce(p->apArg, nAr
e0f0: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
e100: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e  zCsr, &nFree, &n
e110: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
e120: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
e130: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
e140: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 7a  sizeof(char*), z
e150: 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42  Csr, &nFree, &nB
e160: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
e170: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
e180: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
e190: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
e1a0: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26   zCsr, &nFree, &
e1d0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
e1e0: 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63  OnceFlag = alloc
e1f0: 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c  Space(p->aOnceFl
e200: 61 67 2c 20 6e 4f 6e 63 65 2c 20 7a 43 73 72 2c  ag, nOnce, zCsr,
e210: 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29   &nFree, &nByte)
e220: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e230: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
e240: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
e250: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
e260: 65 28 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  e(p->anExec, p->
e270: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c  nOp*sizeof(i64),
e280: 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26   zCsr, &nFree, &
e290: 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  nByte);.#endif. 
e2a0: 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
e2b0: 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d        p->pFree =
e2c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e2d0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
e2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20  .    }.    zCsr 
e2f0: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
e300: 6e 46 72 65 65 20 3d 20 6e 42 79 74 65 3b 0a 20  nFree = nByte;. 
e310: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
e320: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
e330: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
e340: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
e350: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
e360: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
e370: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
e380: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
e390: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
e3a0: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
e3b0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
e3c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e3d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
e3e0: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
e3f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
e400: 7a 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e  zVar && pParse->
e410: 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70  nzVar>0 ){.    p
e420: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->nzVar = pParse
e430: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d  ->nzVar;.    mem
e440: 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50  cpy(p->azVar, pP
e450: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e  arse->azVar, p->
e460: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nzVar*sizeof(p->
e470: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20  azVar[0]));.    
e480: 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61  memset(pParse->a
e490: 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d  zVar, 0, pParse-
e4a0: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50  >nzVar*sizeof(pP
e4b0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  arse->azVar[0]))
e4c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
e4d0: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d  Mem ){.    p->aM
e4e0: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
e4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
e500: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
e510: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d  ..nMem */.    p-
e520: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e540: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
e550: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
e560: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
e570: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  m; n++){.      p
e580: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
e590: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
e5a0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
e5b0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
e5c0: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
e5d0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
e5e0: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
e5f0: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
e600: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
e610: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
e620: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
e630: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
e640: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
e650: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
e660: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
e670: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
e680: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
e690: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
e6a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
e6b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  }.  assert( pCx-
e6c0: 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e  >pBt==0 || pCx->
e6d0: 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
e6e0: 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69  E_BTREE );.  swi
e6f0: 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79  tch( pCx->eCurTy
e700: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43  pe ){.    case C
e710: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b  URTYPE_SORTER: {
e720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e730: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
e740: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20  >db, pCx);.     
e750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e760: 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42    case CURTYPE_B
e770: 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  TREE: {.      if
e780: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
e790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e7a0: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
e7b0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
e7c0: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
e7d0: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
e7e0: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
e7f0: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
e800: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
e810: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20   above. */.     
e820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e830: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e  assert( pCx->uc.
e840: 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
e850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e860: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
e870: 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  x->uc.pCursor);.
e880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e890: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
e8a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e8b0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
e8c0: 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41  case CURTYPE_VTA
e8d0: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
e8e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
e8f0: 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e  pVCur = pCx->uc.
e900: 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e  pVCur;.      con
e910: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
e920: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43  e *pModule = pVC
e930: 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ur->pVtab->pModu
e940: 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  le;.      assert
e950: 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  ( pVCur->pVtab->
e960: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
e970: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
e980: 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64  ef--;.      pMod
e990: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75  ule->xClose(pVCu
e9a0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
e9b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e9c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
e9d0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20   all cursors in 
e9e0: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
e9f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ea00: 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e  d closeCursorsIn
ea10: 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a  Frame(Vdbe *p){.
ea20: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
ea30: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ea40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ea50: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
ea60: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
ea70: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
ea80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
ea90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eaa0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
eab0: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20  p, pC);.        
eac0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
ead0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
eae0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79   }.}../*.** Copy
eaf0: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
eb00: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
eb10: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
eb20: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
eb30: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
eb40: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
eb50: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
eb60: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
eb70: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
eb80: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
eb90: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
eba0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
ebb0: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
ebc0: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
ebd0: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
ebe0: 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  v;.  closeCursor
ebf0: 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66  sInFrame(v);.#if
ec00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ec10: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
ec20: 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20  S.  v->anExec = 
ec30: 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a  pFrame->anExec;.
ec40: 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63  #endif.  v->aOnc
ec50: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ec60: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
ec70: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
ec80: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
ec90: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
eca0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
ecb0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
ecc0: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
ecd0: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
ece0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
ecf0: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
ed00: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
ed10: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
ed20: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
ed30: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
ed40: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
ed50: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
ed60: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
ed70: 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
ed80: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
ed90: 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72  ->nDbChange;.  r
eda0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
edb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
edc0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
edd0: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
ede0: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
edf0: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
ee00: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
ee10: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
ee20: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
ee30: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
ee40: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ee50: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
ee60: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
ee70: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
ee80: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
ee90: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
eea0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
eeb0: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
eec0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
eed0: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
eee0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
eef0: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
ef00: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
ef10: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
ef20: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
ef30: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
ef40: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
ef50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ef60: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
ef70: 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
ef80: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
ef90: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
efa0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
efb0: 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
efc0: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
efd0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
efe0: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
eff0: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
f000: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
f010: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
f020: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
f030: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
f040: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
f050: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
f060: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
f070: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
f080: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
f090: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
f0a0: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
f0b0: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
f0c0: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
f0d0: 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
f0e0: 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
f0f0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c  DeleteAuxData(p,
f100: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
f110: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
f120: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
f130: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
f140: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e  ter a single run
f150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f160: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
f170: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f180: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
f190: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f1a0: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
f1b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
f1c0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
f1d0: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
f1e0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
f1f0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
f200: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
f210: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
f220: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
f230: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
f240: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
f250: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
f260: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
f270: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
f280: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
f290: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
f2a0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
f2b0: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65  .flags==MEM_Unde
f2c0: 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  fined );.  }.#en
f2d0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62  dif..  sqlite3Db
f2e0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
f2f0: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
f300: 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
f310: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a  sultSet = 0;.}..
f320: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
f330: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
f340: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
f350: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
f360: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
f370: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
f380: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
f390: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
f3a0: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
f3b0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
f3c0: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
f3d0: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
f3e0: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
f3f0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
f400: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
f410: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
f420: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
f430: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
f440: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
f450: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
f460: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
f470: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
f480: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
f490: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
f4a0: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
f4b0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
f4c0: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
f4d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f4e0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
f4f0: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
f500: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
f510: 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e  sColumn = (u16)n
f520: 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e  ResColumn;.  p->
f530: 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e  aColName = pColN
f540: 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69  ame = (Mem*)sqli
f550: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f560: 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
f570: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
f580: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
f590: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
f5a0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c   > 0 ){.    pCol
f5b0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Name->flags = ME
f5c0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c  M_Null;.    pCol
f5d0: 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  Name->db = p->db
f5e0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b  ;.    pColName++
f5f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
f600: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  et the name of t
f610: 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e  he idx'th column
f620: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
f630: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
f640: 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d  ment..** zName m
f650: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
f660: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
f670: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  ated string..**.
f680: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73  ** This call mus
f690: 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20  t be made after 
f6a0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
f6b0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
f6c0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e  )..**.** The fin
f6d0: 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44  al parameter, xD
f6e0: 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  el, must be one 
f6f0: 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  of SQLITE_DYNAMI
f700: 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  C, SQLITE_STATIC
f710: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52  .** or SQLITE_TR
f720: 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69  ANSIENT. If it i
f730: 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  s SQLITE_DYNAMIC
f740: 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65  , then the buffe
f750: 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  r pointed.** to 
f760: 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65  by zName will be
f770: 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65   freed by sqlite
f780: 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74  3DbFree() when t
f790: 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72  he vdbe is destr
f7a0: 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oyed..*/.int sql
f7b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
f7c0: 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  me(.  Vdbe *p,  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62         /* Vdbe b
f7f0: 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20  eing configured 
f800: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
f830: 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61  f column zName a
f840: 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69  pplies to */.  i
f850: 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20  nt var,         
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f  /* One of the CO
f880: 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74  LNAME_* constant
f890: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
f8a0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
f8b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f8c0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
f8d0: 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a  taining name */.
f8e0: 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76    void (*xDel)(v
f8f0: 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20  oid*)           
f900: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e     /* Memory man
f910: 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79  agement strategy
f920: 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b   for zName */.){
f930: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
f940: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
f950: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
f960: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
f970: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
f980: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  _N );.  if( p->d
f990: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f9a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
f9b0: 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53  zName || xDel!=S
f9c0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b  QLITE_DYNAMIC );
f9d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f9e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
f9f0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
fa00: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
fa10: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
fa20: 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
fa30: 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
fa40: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
fa50: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
fa60: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
fa70: 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c  QLITE_UTF8, xDel
fa80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
fa90: 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20  =0 || !zName || 
faa0: 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
fab0: 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b  &MEM_Term)!=0 );
fac0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fad0: 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
fae0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
faf0: 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
fb00: 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
fb10: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
fb20: 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
fb30: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
fb40: 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
fb50: 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
fb60: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
fb70: 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
fb80: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
fb90: 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
fba0: 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
fbb0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
fbc0: 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
fbd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
fbe0: 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
fbf0: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
fc00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
fc10: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
fc20: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
fc30: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
fc40: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
fc50: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
fc60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fc70: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
fc80: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
fc90: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fca0: 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20  TABLE.  /* With 
fcb0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c  this option, sql
fcc0: 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69  ite3VtabSync() i
fcd0: 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
fce0: 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c  simply .  ** SQL
fcf0: 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e  ITE_OK so p is n
fd00: 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20  ot used. .  */. 
fd10: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fd20: 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  R(p);.#endif..  
fd30: 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
fd40: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
fd50: 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
fd60: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
fd70: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
fd80: 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
fd90: 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
fda0: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
fdb0: 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
fdc0: 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
fdd0: 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
fde0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fdf0: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
fe00: 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
fe10: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
fe20: 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
fe30: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
fe40: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
fe50: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
fe60: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
fe70: 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  b, p);..  /* Thi
fe80: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
fe90: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
fea0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
feb0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
fec0: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
fed0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
fee0: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
fef0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
ff00: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
ff10: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
ff20: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
ff30: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
ff40: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
ff50: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
ff60: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
ff70: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
ff80: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
ff90: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
ffa0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
ffb0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
ffc0: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
ffd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ffe0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
fff0: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
10000 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10010 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
10020 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
10030 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
10040 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
10050 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
10060 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
10070 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10080 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
10090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
100a0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73  rExclusiveLock(s
100b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
100c0 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71  (pBt));.      sq
100d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
100e0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
100f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10100 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10110 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
10120 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
10130 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10140 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
10150 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
10160 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
10170 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
10180 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
10190 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
101a0 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
101b0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
101c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
101d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
101e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
101f0 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
10200 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
10210 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
10220 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
10230 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
10240 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
10250 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
10260 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
10270 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
10280 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
10290 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
102a0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
102b0 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
102c0 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
102d0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
102e0 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
102f0 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
10300 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
10310 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
10320 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
10330 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
10340 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
10350 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
10360 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
10370 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
10380 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
10390 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
103a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
103b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
103c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
103d0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
103e0 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
103f0 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
10400 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
10410 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
10420 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10430 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10440 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10450 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10470 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10480 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
10490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
104a0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
104b0 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
104c0 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
104d0 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
104e0 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
104f0 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
10500 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
10510 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
10520 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
10530 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
10540 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
10550 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
10560 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
10570 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
10580 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
10590 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
105a0 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
105b0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
105c0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
105d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
105e0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
105f0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
10610 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10620 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10630 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10650 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10660 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
10670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
106a0 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
106b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
106c0 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
106d0 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
106e0 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
106f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
10700 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
10710 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
10720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
10730 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
10740 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
10750 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
10760 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
10770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
10780 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
10790 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
107a0 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
107b0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
107c0 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
107d0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
107e0 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
107f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10800 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
10810 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
10820 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
10830 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
10840 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
10850 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
10860 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
10870 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
10880 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
10890 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30  t retryCount = 0
108a0 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46  ;.    int nMainF
108b0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  ile;..    /* Sel
108c0 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
108d0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
108e0 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20  /.    nMainFile 
108f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
10900 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  0(zMainFile);.  
10910 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
10920 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10930 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22  %s-mjXXXXXX9XXz"
10940 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  , zMainFile);.  
10950 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30    if( zMaster==0
10960 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b  _NOMEM;.    do {
10980 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
10990 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
109a0 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
109b0 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
109c0 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
109d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
109e0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
109f0 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
10a00 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10a10 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
10a20 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
10a30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
10a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
10a50 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
10a60 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
10a70 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10a80 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
10a90 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
10aa0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10ab0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10ac0 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
10ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
10ae0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
10af0 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
10b00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b10 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
10b20 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
10b30 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
10b40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
10b70 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
10b80 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
10b90 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
10ba0 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
10bb0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
10bc0 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
10bd0 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
10be0 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
10bf0 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
10c00 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
10c10 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
10c20 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
10c30 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
10c40 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
10c50 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
10c60 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
10c70 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
10c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10c90 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
10ca0 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
10cb0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
10cc0 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
10cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10ce0 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
10cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10d00 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
10d10 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10d20 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
10d30 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
10d40 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
10d50 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
10d60 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10d70 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
10d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
10d90 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
10da0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
10db0 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
10dc0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
10dd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10de0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10df0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10e10 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10e30 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
10e40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
10e50 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
10e60 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
10e70 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
10e80 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
10e90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
10ea0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
10eb0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
10ec0 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
10ed0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
10ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
10ef0 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
10f00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
10f10 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
10f20 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
10f30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
10f40 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
10f50 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
10f60 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
10f70 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
10f80 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
10f90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
10fa0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10fb0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10fc0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10fd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10fe0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
10ff0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11000 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
11010 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
11020 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
11030 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
11040 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
11050 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
11060 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
11070 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
11080 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
11090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
110a0 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
110b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
110c0 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
110d0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
110e0 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
110f0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
11100 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
11110 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11120 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
11130 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
11140 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11150 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
11160 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
11170 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11180 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
11190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
111a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
111b0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
111c0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
111d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
111e0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
111f0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
11210 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
11230 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11250 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
11260 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11270 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
11280 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
11290 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
112a0 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
112b0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
112c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
112d0 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
112e0 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
112f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11300 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
11310 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
11320 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
11330 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
11340 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
11350 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
11360 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
11370 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11380 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
11390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
113a0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
113b0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
113c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
113d0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
113e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
113f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
11400 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
11410 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
11420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
11430 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
11440 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
11450 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11460 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
11470 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
11480 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
11490 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
114a0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
114b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
114c0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
114d0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
114e0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
114f0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
11500 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
11510 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11520 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
11530 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
11540 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
11550 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11560 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
11570 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
11580 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
11590 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
115a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
115b0 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
115c0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
115d0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
115e0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
115f0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
11600 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11610 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11620 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
11630 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
11640 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11650 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11660 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11680 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11690 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
116a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
116b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
116c0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
116d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
116e0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
116f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11710 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11720 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11740 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
11750 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11760 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11770 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
11780 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
11790 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
117a0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
117b0 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
117c0 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
117d0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
117e0 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
117f0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
11800 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11810 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11820 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e  zMaster, needSyn
11830 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  c);.    sqlite3D
11840 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11850 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
11860 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
11870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11880 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
11890 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
118a0 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
118b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
118c0 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
118d0 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
118e0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
118f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
11900 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
11910 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
11920 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
11930 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
11940 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
11950 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
11960 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
11970 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
11980 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
11990 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
119a0 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
119b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
119c0 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
119d0 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
119e0 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
119f0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
11a00 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
11a10 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
11a20 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
11a30 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
11a40 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
11a50 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11a60 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
11a70 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11a80 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
11a90 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11aa0 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
11ab0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11ac0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11ad0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
11ae0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11af0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
11b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11b10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
11b20 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11b30 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
11b40 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11b50 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
11b60 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
11b70 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
11b80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
11b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11ba0 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
11bb0 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
11bc0 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
11bd0 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
11be0 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
11bf0 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
11c00 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
11c10 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
11c20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
11c30 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
11c40 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
11c50 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
11c60 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
11c70 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
11c80 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
11c90 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
11ca0 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
11cb0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
11cc0 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
11cd0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
11ce0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
11cf0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
11d00 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
11d10 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
11d20 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
11d30 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
11d40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
11d50 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
11d60 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
11d70 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
11d80 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
11d90 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
11da0 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
11db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
11dc0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
11dd0 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
11de0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
11df0 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
11e00 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
11e10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
11e20 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
11e30 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
11e40 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
11e50 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
11e60 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
11e70 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
11e80 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
11e90 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
11ea0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
11eb0 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
11ec0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
11ed0 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
11ee0 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
11ef0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
11f00 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
11f10 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
11f20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
11f30 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
11f40 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
11f50 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
11f60 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
11f70 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
11f80 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
11f90 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
11fa0 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
11fb0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
11fc0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
11fd0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11fe0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
11ff0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
12000 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
12010 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
12020 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12030 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
12040 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
12050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12060 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12070 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
12080 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
12090 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
120a0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
120b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
120c0 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
120d0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
120e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
120f0 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
12100 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
12110 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
12120 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
12130 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
12140 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
12150 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
12160 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
12170 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
12180 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
12190 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
121a0 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
121b0 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
121c0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
121d0 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
121e0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
121f0 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
12200 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
12210 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
12220 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
12230 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
12240 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
12250 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12260 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
12270 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
12280 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
12290 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
122a0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
122b0 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
122c0 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
122d0 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
122e0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
122f0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
12300 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
12310 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
12320 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12330 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12340 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12350 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
12360 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12370 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
12380 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
12390 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
123a0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
123b0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
123c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
123d0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
123e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
123f0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
12400 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
12410 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12420 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
12430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12460 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
12470 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12480 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
12490 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
124a0 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
124b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
124c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
124d0 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
124e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
124f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12500 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
12510 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
12520 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
12530 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
12540 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12570 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
12580 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12590 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
125a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
125b0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
125c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
125d0 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
125e0 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
125f0 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
12600 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12610 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
12620 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
12630 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
12640 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
12650 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12660 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
12670 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
12680 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12690 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
126a0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
126b0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
126c0 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
126d0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
126e0 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
126f0 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
12700 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12710 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12720 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12730 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
12740 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
12750 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
12760 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
12770 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
12780 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
12790 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
127a0 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
127b0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
127c0 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
127d0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
127e0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
127f0 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
12800 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
12810 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
12820 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
12830 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
12840 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
12850 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
12860 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
12870 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
12880 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12890 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
128a0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
128b0 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
128c0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
128d0 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
128e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
128f0 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
12900 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
12910 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
12920 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
12930 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
12940 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
12950 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
12960 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
12970 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
12980 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
12990 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
129a0 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
129b0 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
129c0 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
129d0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
129e0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
129f0 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
12a00 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
12a10 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
12a20 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52  dbeError(p, "FOR
12a30 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
12a40 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
12a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12a60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12a80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12aa0 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
12ab0 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
12ac0 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
12ad0 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
12ae0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
12af0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
12b00 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
12b10 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
12b20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
12b30 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
12b40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
12b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12b60 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
12b70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
12b80 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
12b90 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
12ba0 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
12bb0 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
12bc0 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
12bd0 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
12be0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
12bf0 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
12c00 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
12c10 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
12c20 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
12c30 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
12c40 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
12c50 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
12c60 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
12c70 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
12c80 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
12c90 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
12ca0 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
12cb0 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
12cc0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
12cd0 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
12ce0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
12cf0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
12d00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
12d20 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
12d30 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
12d40 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
12d50 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
12d60 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
12d70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
12d80 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
12d90 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
12da0 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
12db0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
12dc0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
12dd0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
12de0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
12df0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
12e00 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
12e10 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
12e20 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
12e30 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
12e40 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
12e50 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
12e60 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
12e70 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
12e80 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
12e90 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
12ea0 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
12eb0 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
12ec0 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
12ed0 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
12ee0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
12ef0 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
12f00 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
12f10 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12f20 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
12f30 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
12f40 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
12f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
12f60 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
12f70 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12f80 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
12f90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12fa0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
12fb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12fc0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
12fd0 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
12fe0 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
12ff0 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
13000 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
13010 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
13020 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
13030 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
13040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13050 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
13060 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
13070 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
13080 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
13090 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
130a0 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
130b0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
130c0 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
130d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
130f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
13100 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
13110 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
13120 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
13130 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
13140 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
13150 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13160 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
13170 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
13180 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
13190 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
131a0 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
131b0 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
131c0 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
131d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
131e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
131f0 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
13200 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
13210 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13220 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
13230 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
13240 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
13250 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
13260 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
13270 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13290 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
132a0 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
132b0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
132c0 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
132d0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
132e0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
132f0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
13300 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
13310 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13320 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
13330 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
13340 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
13350 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
13360 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
13370 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
13380 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
13390 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
133a0 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
133b0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
133c0 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
133d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
133e0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
133f0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
13400 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
13410 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
13420 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
13430 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
13440 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
13450 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
13460 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
13470 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
13480 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
13490 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
134a0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
134b0 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
134c0 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
134d0 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
134e0 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
134f0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
13500 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
13510 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
13520 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
13530 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
13540 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
13550 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
13560 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
13570 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
13580 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
13590 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
135a0 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
135b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
135c0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
135d0 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
135e0 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
135f0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
13600 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
13610 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
13620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13630 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
13640 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
13650 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
13660 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
13670 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
13680 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
13690 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
136a0 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
136b0 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
136c0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
136d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
136e0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
136f0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
13700 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
13710 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
13720 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
13730 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
13740 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13750 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13760 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
13770 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13780 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13790 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  r immediate fore
137a0 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f  ign key violatio
137b0 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ns. */.    if( p
137c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
137d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
137e0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
137f0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
13800 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
13810 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
13820 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
13830 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
13840 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
13850 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
13860 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
13870 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
13880 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
13890 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
138a0 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
138b0 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
138c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
138d0 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
138e0 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
138f0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
13900 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
13910 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
13920 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
13930 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
13940 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65      && db->nVdbe
13950 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f  Write==(p->readO
13960 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
13970 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
13980 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
13990 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
139a0 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
139b0 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
139c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
139d0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
139e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
139f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13a10 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
13a20 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
13a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
13a40 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
13a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
13a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
13a80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
13a90 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
13aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
13ab0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
13ac0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
13ad0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
13ae0 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
13af0 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
13b00 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
13b10 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
13b20 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
13b30 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
13b40 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
13b50 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
13b60 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
13b70 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
13b80 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
13b90 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
13ba0 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
13bb0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
13bc0 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
13bd0 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
13be0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
13bf0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
13c00 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
13c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13c20 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
13c30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13c40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
13c50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
13c60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13c70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
13c80 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
13c90 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13ca0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
13cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
13cc0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13ce0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
13cf0 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
13d00 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
13d10 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
13d20 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66  .          db->f
13d30 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
13d40 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
13d50 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
13d60 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
13d70 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
13d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13d90 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
13da0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
13db0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
13dc0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
13de0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
13df0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13e00 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
13e10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
13e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
13e30 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
13e40 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
13e50 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
13e60 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
13e70 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
13e80 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
13e90 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
13ea0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
13eb0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
13ec0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
13ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ee0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
13ef0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
13f00 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
13f10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13f20 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
13f30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
13f40 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
13f50 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
13f60 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
13f70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
13f80 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
13f90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
13fa0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
13fb0 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
13fc0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
13fd0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
13fe0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
13ff0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14000 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
14010 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
14020 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
14030 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
14040 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
14050 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
14060 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
14070 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
14080 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
14090 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
140a0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
140b0 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
140c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
140d0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
140e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
140f0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14100 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
14110 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
14120 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14130 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14140 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
14150 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
14160 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
14170 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
14180 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
141a0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
141b0 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
141c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
141d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
141e0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
141f0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14200 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14210 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14220 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14230 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14240 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14250 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14270 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
14280 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
14290 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
142a0 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
142b0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
142c0 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
142d0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
142e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
142f0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
14300 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
14310 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
14320 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
14330 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
14340 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
14350 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
14360 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
14370 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
14380 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
14390 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
143a0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
143b0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
143c0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
143d0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
143e0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
143f0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
14400 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
14410 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
14420 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
14430 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
14440 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
14450 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
14460 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
14470 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
14480 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
14490 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
144a0 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
144b0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
144c0 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
144d0 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
144e0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
144f0 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
14500 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
14510 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
14520 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
14530 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
14540 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
14550 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
14560 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
14570 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
14580 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
14590 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
145a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
145b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
145c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
145d0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
145e0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
145f0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
14600 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
14610 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
14620 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
14630 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
14640 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
14650 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14660 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
14670 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
14680 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
14690 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
146a0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
146b0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
146c0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
146d0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
146e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
146f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
14700 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
14710 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
14720 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
14730 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
14740 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
14750 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
14760 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
14770 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
14780 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
14790 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
147a0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
147b0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
147c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
147d0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
147e0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
147f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14800 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
14810 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
14820 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
14840 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
14850 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
14860 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
14870 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
14880 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
14890 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
148a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
148b0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
148c0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
148d0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
148e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
148f0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
14900 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
14910 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
14920 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
14930 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
14940 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
14950 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
14960 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
14970 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
14980 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
14990 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
149a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
149b0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
149c0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
149d0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
149e0 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65    u8 mallocFaile
149f0 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
14a00 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  iled;.    sqlite
14a10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14a20 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
14a30 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
14a40 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
14a50 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
14a60 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14a70 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
14a80 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
14a90 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
14aa0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
14ab0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
14ac0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
14ad0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14ae0 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  = mallocFailed;.
14af0 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
14b00 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = rc;.  }else{. 
14b10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
14b20 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
14b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14b40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14b50 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
14b60 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
14b70 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
14b80 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
14b90 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
14ba0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
14bb0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
14bc0 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
14bd0 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
14be0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
14bf0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
14c00 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
14c10 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
14c20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
14c30 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
14c40 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
14c50 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
14c60 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
14c70 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
14c80 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
14c90 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
14ca0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
14cb0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
14cc0 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
14cd0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14ce0 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
14cf0 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
14d00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
14d10 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
14d20 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
14d30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
14d40 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
14d50 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
14d60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
14d70 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
14d80 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
14d90 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
14da0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
14db0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
14dc0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
14dd0 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
14de0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
14df0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
14e00 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
14e10 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
14e20 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
14e30 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
14e40 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
14e50 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
14e60 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
14e70 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
14e80 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
14e90 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
14ea0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
14eb0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
14ec0 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
14ed0 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
14ee0 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
14ef0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
14f00 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
14f10 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
14f20 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
14f30 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
14f40 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
14f50 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
14f60 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
14f70 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
14f80 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
14f90 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
14fa0 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
14fb0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
14fc0 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
14fd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
14fe0 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
14ff0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
15000 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
15010 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
15020 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
15030 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
15040 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
15050 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15060 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
15070 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
15080 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
15090 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
150a0 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
150b0 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
150c0 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
150d0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
150e0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
150f0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
15100 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
15110 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
15120 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
15130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
15140 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
15150 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15160 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15170 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15180 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  g = 0;.    if( p
15190 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
151a0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
151b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
151c0 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
151d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
151e0 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
151f0 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
15200 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
15210 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
15220 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
15230 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
15240 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
15250 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
15260 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
15270 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
15280 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
15290 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
152a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
152b0 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
152c0 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
152d0 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
152e0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
152f0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15300 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15310 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
15320 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
15330 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
15340 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
15350 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
15360 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
15370 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
15380 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
15390 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
153a0 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
153b0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
153c0 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
153d0 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
153e0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
153f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15400 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15410 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
15420 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
15430 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
15440 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
15450 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
15460 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
15470 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15480 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
15490 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
154a0 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
154b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
154c0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
154d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
154e0 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
154f0 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
15500 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
15510 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15520 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
15530 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
15540 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
15550 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
15560 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
15570 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15580 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
15590 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
155a0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
155b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
155c0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
155d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
155e0 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
155f0 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
15600 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
15610 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15620 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
15630 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
15640 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
15650 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
15660 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15670 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
15680 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
15690 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
156a0 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
156b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
156c0 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
156d0 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
156e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
156f0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
15700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
15710 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20  >iCurrentTime = 
15720 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  0;.  p->magic = 
15730 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
15740 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
15750 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
15760 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
15770 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
15780 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
15790 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
157a0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
157b0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
157c0 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
157d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
157e0 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
157f0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
15800 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
15810 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
15820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15830 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
15840 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
15850 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15860 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
15870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
15880 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
15890 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
158a0 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
158b0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
158c0 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
158d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
158e0 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
158f0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
15900 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
15910 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
15920 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
15930 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
15940 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
15950 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
15960 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
15970 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
15980 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
15990 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
159a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
159b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
159c0 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
159d0 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
159e0 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
159f0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
15a00 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
15a10 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
15a20 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
15a30 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
15a40 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
15a50 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
15a60 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
15a70 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
15a80 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
15a90 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
15aa0 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
15ab0 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
15ac0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
15ad0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
15ae0 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
15af0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15b00 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
15b10 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
15b20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
15b30 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
15b40 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
15b50 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
15b60 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
15b70 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15b80 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70  eAuxData(Vdbe *p
15b90 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69  Vdbe, int iOp, i
15ba0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44  nt mask){.  AuxD
15bb0 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62  ata **pp = &pVdb
15bc0 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77  e->pAuxData;.  w
15bd0 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
15be0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
15bf0 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
15c00 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
15c10 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
15c20 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
15c30 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
15c40 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
15c50 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
15c60 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
15c70 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
15c80 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
15c90 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
15ca0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
15cb0 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
15cc0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
15cd0 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
15ce0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15cf0 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
15d00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15d10 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
15d20 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
15d30 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
15d40 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
15d50 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
15d60 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
15d70 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
15d80 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
15d90 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
15da0 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
15db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
15dc0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
15dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
15de0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15df0 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
15e00 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
15e10 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
15e20 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
15e30 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
15e40 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
15e50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15e60 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
15e70 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
15e80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
15e90 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
15ea0 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
15eb0 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
15ec0 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
15ed0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
15ee0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
15ef0 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
15f00 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
15f10 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
15f20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
15f30 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
15f40 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
15f50 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
15f60 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
15f70 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
15f80 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
15f90 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
15fa0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
15fb0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
15fc0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
15fd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15fe0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
15ff0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
16000 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
16010 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16020 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
16030 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
16040 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
16050 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
16060 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
16070 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
16080 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
16090 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
160a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
160b0 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ee);.#ifdef SQLI
160c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
160d0 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28  CANSTATUS.  for(
160e0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b  i=0; i<p->nScan;
160f0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
16100 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16110 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aScan[i].zName);
16120 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
16130 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16140 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  n);.#endif.}../*
16150 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
16160 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
16170 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
16180 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
16190 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
161a0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
161b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
161c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
161d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
161e0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
161f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
16200 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c  eClearObject(db,
16210 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50   p);.  if( p->pP
16220 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
16230 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
16240 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
16250 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16260 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
16270 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
16280 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
16290 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
162a0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
162b0 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
162c0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
162d0 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
162e0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
162f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16300 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
16310 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61  cursor "p" has a
16320 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70   pending seek op
16330 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  eration that has
16340 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
16350 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53   carried out.  S
16360 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e  eek the cursor n
16370 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  ow.  If an error
16380 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a   occurs, return.
16390 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
163a0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
163b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
163c0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
163d0 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
163e0 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
163f0 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b  {.  int res, rc;
16400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16410 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
16420 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
16430 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
16440 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72  assert( p->defer
16450 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61  redMoveto );.  a
16460 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
16470 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
16480 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
16490 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72  YPE_BTREE );.  r
164a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
164b0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
164c0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
164d0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
164e0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
164f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16500 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
16510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16520 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
16530 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16540 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
16550 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
16560 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
16570 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
16580 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
16590 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
165a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
165b0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
165c0 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
165d0 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
165e0 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
165f0 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
16600 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
16610 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
16620 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
16630 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
16640 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
16650 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
16660 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
16670 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
16680 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
16690 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
166a0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
166b0 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
166c0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
166d0 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
166e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
166f0 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
16700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16710 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
16720 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
16730 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
16740 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
16750 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
16760 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
16770 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
16780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16790 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
167a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
167b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
167c0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
167d0 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
167e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
167f0 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e  orRestore(p->uc.
16800 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
16810 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
16820 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
16830 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
16840 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
16850 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
16860 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16870 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
16880 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
16890 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
168a0 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
168b0 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
168c0 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
168d0 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
168e0 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
168f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
16900 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
16910 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
16920 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
16930 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
16940 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
16950 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
16960 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16970 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
16980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
16990 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
169a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
169b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
169c0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
169d0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
169e0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
169f0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
16a00 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
16a10 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
16a20 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
16a30 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
16a40 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
16a50 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
16a60 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
16a70 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
16a80 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
16a90 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
16aa0 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
16ab0 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
16ac0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
16ad0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
16ae0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
16af0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
16b00 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
16b10 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
16b20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
16b30 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
16b40 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
16b50 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
16b60 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
16b70 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
16b80 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
16b90 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
16ba0 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
16bb0 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
16bc0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
16bd0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
16be0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
16bf0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
16c00 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
16c10 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
16c20 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
16c30 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
16c40 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75  p){.  if( p->eCu
16c50 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16c60 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20  TREE ){.    if( 
16c70 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16c80 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  o ){.      retur
16c90 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
16ca0 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d  Moveto(p);.    }
16cb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16cc0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
16cd0 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
16ce0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
16cf0 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
16d00 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20  rsor(p);.    }. 
16d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16d30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
16d40 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
16d50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16d60 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
16d70 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
16d80 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
16d90 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
16da0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
16db0 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
16dc0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16dd0 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
16de0 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
16df0 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
16e00 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
16e10 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
16e20 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
16e30 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
16e40 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
16e50 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
16e60 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
16e70 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
16e80 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
16e90 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
16ea0 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
16eb0 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
16ec0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
16ed0 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
16ee0 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
16ef0 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
16f00 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
16f10 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
16f20 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
16f30 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
16f40 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
16f50 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
16f60 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
16f70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16f80 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
16f90 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
16fa0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
16fb0 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
16fc0 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
16fd0 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
16fe0 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
16ff0 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
17000 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
17010 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17020 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
17030 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
17040 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
17050 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
17060 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
17070 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
17080 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
170a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
170b0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
170c0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
170f0 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
17120 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17130 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
17150 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17160 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17170 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
17180 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
17190 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
171a0 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
171d0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
171e0 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
171f0 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
17200 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17210 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
17240 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17250 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
17270 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
17280 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
172b0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
172c0 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
172f0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
17300 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17330 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
17340 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
17350 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
17360 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
17370 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
17380 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
17390 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
173a0 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
173b0 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
173c0 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
173d0 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
173e0 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
173f0 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
17400 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
17410 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
17420 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
17430 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
17440 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
17450 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
17460 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
17470 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17480 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
17490 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
174a0 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
174b0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
174c0 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
174d0 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
174e0 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
174f0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
17500 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
17510 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
17520 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
17530 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
17540 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
17550 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
17560 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
17570 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
17580 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
17590 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
175a0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
175b0 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
175c0 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
175d0 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
175e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
175f0 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
17600 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
17610 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
17620 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
17630 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
17640 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
17650 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
17660 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
17670 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
17680 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
17690 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
176a0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
176b0 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
176c0 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
176d0 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
176e0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
176f0 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
17700 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
17710 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
17720 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
17730 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
17740 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
17750 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
17760 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
17770 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
17780 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
17790 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
177a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
177b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
177c0 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
177d0 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
177e0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
177f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
17800 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
17810 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
17820 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
17830 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
17840 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
17850 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
17860 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
17870 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
17880 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
17890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
178a0 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
178b0 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
178c0 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
178d0 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
178e0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
178f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
17900 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
17910 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
17920 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
17930 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
17940 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
17950 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
17960 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
17970 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
17980 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
17990 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
179a0 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
179b0 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
179c0 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
179d0 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
179e0 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
179f0 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
17a00 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
17a10 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
17a20 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
17a30 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
17a40 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
17a50 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
17a60 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
17a70 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
17a80 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
17a90 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
17aa0 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
17ab0 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
17ac0 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
17ad0 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
17ae0 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
17af0 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
17b00 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
17b10 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
17b20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
17b30 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
17b40 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
17b50 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
17b60 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
17b70 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
17b80 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
17b90 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
17ba0 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
17bb0 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
17bc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
17bd0 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
17be0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
17bf0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
17c00 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
17c10 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17c20 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
17c30 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
17c40 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
17c50 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
17c60 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
17c70 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
17c80 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
17c90 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
17ca0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
17cb0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
17cc0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
17cd0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
17ce0 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
17cf0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17d00 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
17d10 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
17d20 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
17d30 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
17d40 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
17d50 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
17d60 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
17d70 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
17d80 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
17d90 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
17da0 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
17db0 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
17dc0 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
17dd0 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
17de0 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
17df0 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
17e00 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
17e10 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
17e20 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
17e30 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
17e40 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
17e50 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
17e60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
17e70 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
17e80 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
17e90 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
17ea0 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
17eb0 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
17ec0 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
17ed0 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
17ee0 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
17ef0 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
17f00 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
17f10 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
17f20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
17f30 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
17f40 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
17f50 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
17f60 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
17f70 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
17f80 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
17f90 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
17fa0 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
17fb0 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
17fc0 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
17fd0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
17fe0 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
17ff0 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
18000 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
18010 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
18020 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
18030 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
18040 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
18050 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
18060 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
18070 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
18080 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
18090 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
180a0 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
180b0 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
180c0 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
180d0 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
180e0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
180f0 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
18100 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
18110 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
18120 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
18130 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
18140 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
18150 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
18160 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
18170 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
18180 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
18190 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
181a0 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
181b0 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
181c0 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
181d0 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
181e0 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
181f0 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
18200 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
18210 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
18220 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
18230 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
18240 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
18250 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
18260 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
18270 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
18280 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
18290 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
182a0 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
182b0 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
182c0 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
182d0 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
182e0 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
182f0 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
18300 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
18310 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
18320 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
18330 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
18340 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
18350 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
18360 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
18370 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
18380 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
18390 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
183a0 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
183b0 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
183c0 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
183d0 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
183e0 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
183f0 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
18400 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
18410 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
18420 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
18430 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
18440 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
18450 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
18460 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
18470 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
18480 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
18490 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
184a0 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
184b0 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
184c0 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
184d0 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
184e0 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
184f0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
18500 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
18510 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
18520 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18530 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
18540 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
18550 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
18560 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
18570 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
18580 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
18590 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
185a0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
185b0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
185c0 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
185d0 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
185e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
185f0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
18600 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
18610 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
18620 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
18630 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
18640 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
18650 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
18660 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
18670 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
18680 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
18690 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
186a0 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
186b0 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
186c0 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
186d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
186e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
186f0 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
18700 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
18710 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
18720 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
18730 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
18740 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
18750 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
18760 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
18770 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
18780 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
18790 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
187a0 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
187b0 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
187c0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
187d0 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
187e0 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
187f0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
18800 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
18810 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
18820 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
18830 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
18840 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
18850 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
18860 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
18870 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
18880 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
18890 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
188a0 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
188b0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
188c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
188d0 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
188e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
188f0 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
18900 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18910 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
18920 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
18930 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
18940 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
18950 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
18960 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
18970 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
18980 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
18990 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
189a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
189b0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
189c0 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
189d0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
189e0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
189f0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
18a00 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
18a10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18a20 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
18a30 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
18a40 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69  = pMem->n;.    i
18a50 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70  f( len>0 ) memcp
18a60 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
18a70 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
18a80 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
18a90 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
18aa0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
18ab0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
18ac0 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
18ad0 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
18ae0 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
18af0 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
18b00 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
18b10 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
18b20 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
18b30 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
18b40 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
18b50 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
18b60 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
18b70 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
18b80 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
18b90 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
18ba0 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
18bb0 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
18bc0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
18bd0 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
18be0 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
18bf0 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
18c00 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
18c10 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
18c20 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
18c30 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
18c40 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
18c50 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
18c60 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
18c70 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
18c80 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
18c90 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
18ca0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
18cb0 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
18cc0 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
18cd0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
18ce0 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
18cf0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18d00 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
18d10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18d20 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
18d30 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
18d40 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
18d50 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
18d60 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
18d70 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
18d80 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
18d90 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
18da0 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
18db0 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
18dc0 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
18dd0 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
18de0 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
18df0 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
18e00 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
18e10 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
18e20 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
18e30 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18e40 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
18e50 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
18e60 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
18e70 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e90 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
18ea0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
18eb0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ed0 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
18ee0 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
18ef0 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
18f00 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
18f10 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
18f20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
18f30 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
18f40 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
18f50 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
18f60 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
18f70 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
18f80 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
18f90 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
18fa0 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
18fb0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
18fc0 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
18fd0 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
18fe0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
18ff0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
19000 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19010 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
19020 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19030 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
19040 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
19050 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
19060 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
19070 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
19080 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
19090 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
190a0 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
190b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
190c0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
190d0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
190e0 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
190f0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19100 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
19110 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
19120 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
19130 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
19140 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
19150 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
19160 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
19170 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
19180 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
19190 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
191a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
191b0 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
191c0 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
191d0 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
191e0 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
191f0 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
19200 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
19210 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19220 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
19230 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
19240 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
19250 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
19260 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
19270 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
19280 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
19290 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
192a0 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
192b0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
192c0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
192d0 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
192e0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
192f0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
19300 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
19310 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
19320 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
19330 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
19340 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
19350 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
19360 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
19370 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
19380 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
19390 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
193a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
193b0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
193c0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
193d0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
193e0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
19410 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
19420 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
19430 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
19440 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
19450 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
19460 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
19470 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
19480 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
19490 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
194a0 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
194b0 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
194c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
194d0 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
194e0 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
194f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19500 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
19510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19520 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
19530 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19540 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
19550 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
19560 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
19570 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
19580 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19590 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
195a0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
195b0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
195c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
195d0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
195e0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
195f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
19600 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
19610 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
19620 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
19630 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19640 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
19650 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19660 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
19670 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19680 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19690 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
196a0 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
196b0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
196c0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
196d0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
196e0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
196f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
19700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19710 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
19720 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19730 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19740 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
19750 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
19760 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
19770 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
19780 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
19790 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
197a0 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
197b0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
197c0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
197d0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
197e0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
197f0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19800 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
19810 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
19820 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
19830 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
19840 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19850 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
19860 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19870 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
19880 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19890 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
198a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
198b0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
198c0 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
198d0 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
198e0 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
198f0 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
19900 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
19910 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
19920 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
19930 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
19940 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
19950 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
19960 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
19970 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
199a0 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
199b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
199c0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
199d0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
199e0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
199f0 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
19a00 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
19a10 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
19a20 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19a30 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19a40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19a50 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
19a60 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
19a70 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
19a80 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
19a90 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19aa0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19ac0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19ad0 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
19ae0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
19af0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
19b00 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19b10 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
19b20 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
19b30 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
19b40 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
19b50 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
19b60 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
19b70 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
19b80 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
19b90 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
19ba0 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
19bb0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
19bc0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
19bd0 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
19be0 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
19bf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19c00 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
19c10 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
19c20 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
19c30 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
19c40 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
19c50 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
19c60 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
19c70 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19c80 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
19c90 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
19ca0 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
19cb0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19cc0 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
19cd0 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
19ce0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19d00 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
19d10 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
19d20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
19d30 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
19d40 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
19d50 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
19d60 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
19d70 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
19d80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
19d90 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
19da0 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
19db0 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
19dc0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
19dd0 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
19de0 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
19df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
19e00 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
19e10 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
19e20 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
19e30 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
19e40 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
19e50 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
19e60 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
19e70 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
19e80 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
19e90 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
19ea0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
19eb0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
19ec0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
19ed0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19ee0 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
19ef0 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
19f00 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
19f10 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
19f20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
19f30 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
19f40 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
19f50 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
19f60 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
19f70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
19f80 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
19f90 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
19fa0 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
19fb0 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
19fc0 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
19fd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
19fe0 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
19ff0 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1a000 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1a010 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1a020 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1a030 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1a040 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1a050 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1a060 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1a070 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1a080 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1a090 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1a0a0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1a0b0 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1a0c0 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1a0d0 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1a0e0 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1a0f0 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1a100 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1a110 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1a120 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1a130 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1a140 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1a150 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1a160 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1a170 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1a180 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1a190 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1a1a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a1c0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1a1d0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68  e record */.  ch
1a1e0 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20  ar *pSpace,     
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a200 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65   Unaligned space
1a210 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
1a220 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20  int szSpace,    
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63  /* Size of pSpac
1a250 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  e[] in bytes */.
1a260 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20    char **ppFree 
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72    /* OUT: Caller
1a290 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69   should free thi
1a2a0 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a  s pointer */.){.
1a2b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1a2c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1a2d0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
1a2e0 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
1a2f0 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20  /.  int nOff;   
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1a320 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20   pSpace by nOff 
1a330 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  to align it */. 
1a340 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1a370 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1a380 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20   *p */..  /* We 
1a390 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
1a3a0 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
1a3b0 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
1a3c0 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
1a3d0 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
1a3e0 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
1a3f0 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
1a400 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
1a410 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
1a420 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
1a430 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
1a440 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
1a450 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
1a460 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
1a470 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
1a480 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
1a490 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
1a4a0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1a4b0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1a4c0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1a4d0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1a4e0 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
1a4f0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e   nByte>szSpace+n
1a500 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  Off ){.    p = (
1a510 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a520 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1a530 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1a540 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70  , nByte);.    *p
1a550 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  pFree = (char *)
1a560 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20  p;.    if( !p ) 
1a570 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1a580 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
1a590 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70  ckedRecord*)&pSp
1a5a0 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a  ace[nOff];.    *
1a5b0 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppFree = 0;.  }.
1a5c0 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1a5d0 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1a5e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1a5f0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1a600 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1a610 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1a620 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1a630 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1a640 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1a650 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1a660 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1a670 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1a680 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1a690 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1a6a0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1a6b0 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1a6c0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1a6d0 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1a6e0 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1a6f0 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1a700 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1a710 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1a720 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1a730 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1a740 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1a750 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1a760 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1a770 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1a780 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1a790 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1a7a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a7b0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1a7c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1a7d0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1a7e0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1a7f0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1a800 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1a810 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1a820 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1a830 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1a840 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a850 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1a860 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a870 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1a880 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1a8b0 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1a8c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1a8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a8f0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1a900 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1a910 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1a920 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1a930 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1a940 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1a950 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1a960 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1a970 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1a980 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1a990 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1a9a0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1a9b0 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1a9c0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1a9d0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1a9e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1a9f0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1aa00 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1aa10 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1aa20 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1aa30 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1aa40 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1aa50 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1aa60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1aa70 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1aa80 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1aa90 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1aaa0 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1aab0 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1aac0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1aad0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1aae0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1aaf0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1ab00 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1ab10 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1ab20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ab30 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
1ab40 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
1ab50 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
1ab60 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1ab70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ab80 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
1ab90 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
1aba0 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
1abb0 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
1abc0 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
1abd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1abe0 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
1abf0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
1ac00 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
1ac10 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1ac20 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
1ac30 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
1ac40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
1ac50 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
1ac60 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1ac70 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
1ac80 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
1ac90 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1aca0 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
1acb0 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
1acc0 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
1acd0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ace0 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
1acf0 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
1ad00 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
1ad10 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1ad20 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
1ad30 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
1ad40 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1ad50 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
1ad60 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1ad70 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
1ad80 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
1ad90 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1ada0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1adb0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1adc0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1add0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1ade0 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
1adf0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1ae00 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1ae10 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
1ae20 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
1ae30 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
1ae40 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
1ae50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1ae60 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1ae70 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1ae80 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1ae90 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1aea0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1aeb0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
1aec0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
1aed0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1aee0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aef0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
1af00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
1af10 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
1af20 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1af30 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1af40 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1af50 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1af60 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1af70 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
1af80 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
1af90 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1afa0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1afb0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1afc0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
1afd0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
1afe0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1aff0 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
1b000 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
1b010 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
1b020 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
1b030 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
1b040 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1b050 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1b060 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1b070 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1b080 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
1b090 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
1b0a0 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
1b0b0 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
1b0c0 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
1b0d0 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
1b0e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
1b0f0 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
1b100 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
1b110 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
1b120 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
1b130 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
1b140 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
1b150 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
1b160 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
1b170 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
1b180 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
1b190 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
1b1a0 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
1b1b0 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
1b1c0 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
1b1d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
1b1e0 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
1b1f0 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
1b200 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
1b210 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
1b220 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
1b230 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
1b240 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1b250 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
1b260 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
1b270 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
1b280 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
1b290 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
1b2a0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1b2b0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1b2c0 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e  );.  if( szHdr1>
1b2d0 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53  98307 ) return S
1b2e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1b2f0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1b300 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b310 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1b320 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1b330 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
1b340 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1b350 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1b360 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1b370 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b380 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1b390 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1b3a0 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1b3b0 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1b3c0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b3d0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1b3e0 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1b3f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1b400 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1b410 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1b420 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b430 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1b440 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1b450 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1b460 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1b470 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1b480 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1b490 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1b4a0 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1b4b0 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1b4c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1b4d0 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1b4e0 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1b4f0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1b500 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1b510 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1b520 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1b530 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1b540 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1b550 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1b560 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1b570 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1b580 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1b590 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1b5a0 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
1b5b0 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
1b5c0 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
1b5d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b5e0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1b5f0 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
1b600 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
1b610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b620 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1b630 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
1b640 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1b650 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1b660 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1b670 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1b680 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
1b690 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
1b6a0 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
1b6b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b6c0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
1b6d0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
1b6e0 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
1b6f0 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
1b700 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1b710 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1b720 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1b730 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1b740 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1b750 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1b760 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1b770 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1b780 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1b790 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1b7a0 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1b7b0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1b7c0 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1b7d0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1b7e0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1b7f0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1b800 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1b810 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1b820 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1b830 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1b840 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1b850 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1b860 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1b870 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1b880 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1b890 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1b8a0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1b8b0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1b8c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1b8d0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1b8e0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1b8f0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1b900 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1b910 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1b920 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1b930 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1b940 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1b950 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1b960 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1b970 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1b980 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1b990 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1b9a0 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1b9b0 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1b9c0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1b9d0 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1b9e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1b9f0 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1ba00 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1ba10 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1ba20 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1ba30 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1ba40 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1ba50 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1ba60 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1ba70 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1ba80 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1ba90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1baa0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1bab0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1bac0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1bad0 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1bae0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1baf0 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1bb00 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1bb10 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1bb20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1bb30 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1bb40 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1bb50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1bb60 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  + pKeyInfo->nXFi
1bb70 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1bb80 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1bb90 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1bba0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1bbb0 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1bbc0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bbd0 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1bbe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1bbf0 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1bc00 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1bc10 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1bc20 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1bc30 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1bc40 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1bc50 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46  t the KeyInfo.nF
1bc60 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1bc70 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  nXField values w
1bc80 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1bc90 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1bca0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1bcb0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1bcc0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1bcd0 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1bce0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1bcf0 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1bd00 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1bd10 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1bd20 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1bd30 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1bd40 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1bd50 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1bd60 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1bd70 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1bd80 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1bd90 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bda0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1bdb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1bdc0 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1bdd0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1bde0 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1bdf0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1be00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1be10 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1be20 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1be30 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1be40 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1be50 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1be60 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1be70 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1be80 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1be90 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1bea0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1beb0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20  eyInfo->nXField 
1bec0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1bed0 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1bee0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1bef0 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1bf00 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1bf10 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1bf20 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1bf30 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1bf40 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1bf50 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1bf60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1bf70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1bf80 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1bf90 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1bfa0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1bfb0 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1bfc0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1bfd0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1bfe0 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1bff0 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1c000 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1c010 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1c020 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1c030 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1c040 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1c050 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1c060 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1c070 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1c080 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1c090 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1c0c0 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1c0d0 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1c0e0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1c0f0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1c100 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1c110 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1c120 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1c130 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1c140 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1c150 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1c160 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1c170 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1c180 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1c190 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1c1a0 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1c1b0 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1c1c0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1c1d0 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1c1e0 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ;.    int n1, n2
1c1f0 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1c200 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1c210 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1c220 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1c230 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1c240 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c250 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1c260 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c270 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c280 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1c290 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1c2a0 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1c2b0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1c2c0 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1c2d0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1c2e0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1c2f0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1c300 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1c310 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76  enc);.    n1 = v
1c320 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b  1==0 ? 0 : c1.n;
1c330 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
1c340 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1c350 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20  te3_value*)&c2, 
1c360 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1c370 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20   n2 = v2==0 ? 0 
1c380 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d  : c2.n;.    rc =
1c390 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1c3a0 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76  ll->pUser, n1, v
1c3b0 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20  1, n2, v2);.    
1c3c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1c3d0 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20  lease(&c1);.    
1c3e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1c3f0 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20  lease(&c2);.    
1c400 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1c410 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29  ==0) && prcErr )
1c420 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1c430 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
1c440 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1c450 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1c460 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1c470 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1c480 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1c490 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1c4a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c4b0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1c4c0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1c4d0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1c4e0 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1c4f0 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1c500 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1c510 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1c520 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  essor..*/.static
1c530 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1c540 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62   int sqlite3Blob
1c550 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1c560 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65  m *pB1, const Me
1c570 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63  m *pB2){.  int c
1c580 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1c590 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  , pB2->z, pB1->n
1c5a0 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e  >pB2->n ? pB2->n
1c5b0 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66   : pB1->n);.  if
1c5c0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1c5d0 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20    return pB1->n 
1c5e0 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a  - pB2->n;.}../*.
1c5f0 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  ** Do a comparis
1c600 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d  on between a 64-
1c610 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1c620 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20  er and a 64-bit 
1c630 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a  floating-point.*
1c640 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  * number.  Retur
1c650 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1c660 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1c670 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29   the first (i64)
1c680 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a   is less than,.*
1c690 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  * equal to, or g
1c6a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1c6b0 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e  second (double).
1c6c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c6d0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1c6e0 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75  mpare(i64 i, dou
1c6f0 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69  ble r){.  if( si
1c700 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  zeof(LONGDOUBLE_
1c710 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c  TYPE)>8 ){.    L
1c720 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78  ONGDOUBLE_TYPE x
1c730 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54   = (LONGDOUBLE_T
1c740 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78  YPE)i;.    if( x
1c750 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1c760 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65      if( x>r ) re
1c770 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1c780 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1c790 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64      i64 y;.    d
1c7a0 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28  ouble s;.    if(
1c7b0 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35   r<-922337203685
1c7c0 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1c7d0 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72  rn +1;.    if( r
1c7e0 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  >922337203685477
1c7f0 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20  5807.0 ) return 
1c800 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34  -1;.    y = (i64
1c810 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20  )r;.    if( i<y 
1c820 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1c830 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20   if( i>y ){.    
1c840 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53    if( y==SMALLES
1c850 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30  T_INT64 && r>0.0
1c860 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1c870 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1c880 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f     }.    s = (do
1c890 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20  uble)i;.    if( 
1c8a0 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  s<r ) return -1;
1c8b0 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72  .    if( s>r ) r
1c8c0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1c8d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
1c8e0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1c8f0 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1c900 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1c910 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1c920 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1c930 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1c940 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1c950 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c960 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1c970 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1c980 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1c990 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1c9a0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1c9b0 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1c9c0 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1c9d0 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1c9e0 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1c9f0 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1ca00 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1ca10 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1ca20 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1ca30 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1ca40 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1ca50 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1ca60 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1ca70 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1ca80 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1ca90 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1caa0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1cab0 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1cac0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1cad0 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1cae0 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1caf0 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1cb00 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1cb10 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1cb20 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1cb30 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1cb40 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1cb50 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1cb60 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1cb70 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1cb80 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1cb90 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1cba0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1cbb0 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1cbc0 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1cbd0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1cbe0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1cbf0 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1cc00 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1cc10 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1cc20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  /* At least one 
1cc30 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  of the two value
1cc40 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20  s is a number.  
1cc50 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1cc60 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  d_flags&(MEM_Int
1cc70 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20  |MEM_Real) ){.  
1cc80 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1cc90 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
1cca0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1ccb0 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
1ccc0 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
1ccd0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1cce0 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
1ccf0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1cd00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cd10 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20    }.    if( (f1 
1cd20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29  & f2 & MEM_Real)
1cd30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1cd40 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d   pMem1->u.r < pM
1cd50 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1cd60 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1cd70 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65  pMem1->u.r > pMe
1cd80 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1cd90 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1cda0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1cdb0 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21  f( (f1&MEM_Int)!
1cdc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cdd0 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
1cde0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1cdf0 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  rn sqlite3IntFlo
1ce00 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d  atCompare(pMem1-
1ce10 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72  >u.i, pMem2->u.r
1ce20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ce30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1ce40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ce50 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1ce60 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1ce70 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49     if( (f2&MEM_I
1ce80 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1ce90 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65    return -sqlite
1cea0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1ceb0 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem2->u.i, pMe
1cec0 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m1->u.r);.      
1ced0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1cee0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1cef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
1cf00 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn +1;.  }..  /*
1cf10 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1cf20 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68   a string and th
1cf30 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f  e other is a blo
1cf40 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  b, the string is
1cf50 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1cf60 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c  oth are strings,
1cf70 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74   compare using t
1cf80 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  he collating fun
1cf90 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
1cfa0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1cfb0 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
1cfc0 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53   if( (f1 & MEM_S
1cfd0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1cfe0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1cff0 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45      if( (f2 & ME
1d000 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1d010 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1d020 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d030 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65   pMem1->enc==pMe
1d040 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61  m2->enc );.    a
1d050 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1d060 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
1d070 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  | .            p
1d080 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1d090 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65  E_UTF16LE || pMe
1d0a0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1d0b0 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20  UTF16BE );..    
1d0c0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
1d0d0 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62   sequence must b
1d0e0 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69  e defined at thi
1d0f0 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66  s point, even if
1d100 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
1d110 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c   deletes the col
1d120 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1d130 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70  after the vdbe p
1d140 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a  rogram is.    **
1d150 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20   compiled (this 
1d160 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74  was not always t
1d170 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f  he case)..    */
1d180 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
1d190 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43  oll || pColl->xC
1d1a0 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  mp );..    if( p
1d1b0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1d1c0 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65  turn vdbeCompare
1d1d0 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c  MemString(pMem1,
1d1e0 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30   pMem2, pColl, 0
1d1f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
1d200 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
1d210 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
1d220 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
1d230 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
1d240 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
1d250 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
1d260 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
1d270 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
1d280 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1d290 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
1d2a0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
1d2b0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
1d2c0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1d2d0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d  pMem1, pMem2);.}
1d2e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .../*.** The fir
1d2f0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
1d300 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1d310 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d  ion is a serial-
1d320 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72  type that.** cor
1d330 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69  responds to an i
1d340 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c  nteger - all val
1d350 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ues between 1 an
1d360 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a  d 9 inclusive .*
1d370 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20  * except 7. The 
1d380 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f  second points to
1d390 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1d3a0 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20  ning an integer 
1d3b0 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69  value.** seriali
1d3c0 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  zed according to
1d3d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68   serial_type. Th
1d3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1d3f0 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20  rializes.** and 
1d400 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1d410 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  e..*/.static i64
1d420 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1d430 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f  eInt(u32 serial_
1d440 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  type, const u8 *
1d450 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a  aKey){.  u32 y;.
1d460 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1d470 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f  T_DB || (serial_
1d480 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61  type>=1 && seria
1d490 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72  l_type<=9 && ser
1d4a0 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a  ial_type!=7) );.
1d4b0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1d4c0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1d4d0 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a  e 0:.    case 1:
1d4e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d4f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e  .      return ON
1d510 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1d520 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
1d530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d540 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d550 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42      return TWO_B
1d560 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d570 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20     case 3:.     
1d580 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d590 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d5a0 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59   return THREE_BY
1d5b0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d5c0 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20    case 4: {.    
1d5d0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d5e0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d5f0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1d600 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1d610 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1d620 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20  int*)&y;.    }. 
1d630 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
1d640 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d650 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d660 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42     return FOUR_B
1d670 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1d680 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1d690 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1d6a0 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
1d6b0 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20  case 6: {.      
1d6c0 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
1d6d0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1d6e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d6f0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d700 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1d710 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1d720 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1d730 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36  return (i64)*(i6
1d740 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  4*)&x;.    }.  }
1d750 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69  ..  return (seri
1d760 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a  al_type - 8);.}.
1d770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d780 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
1d790 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
1d7a0 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
1d7b0 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
1d7c0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
1d7d0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
1d7e0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1d7f0 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
1d800 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1d810 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
1d820 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1d830 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
1d840 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
1d850 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
1d860 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
1d870 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
1d880 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1d890 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1d8a0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1d8b0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1d8c0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1d8d0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1d8e0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1d8f0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1d900 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1d910 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
1d920 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
1d930 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1d940 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1d950 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1d960 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
1d970 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
1d980 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
1d990 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
1d9a0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
1d9b0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
1d9c0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
1d9d0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
1d9e0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
1d9f0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
1da00 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
1da10 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
1da20 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
1da30 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
1da40 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
1da50 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
1da60 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20  ey2->errCode to 
1da70 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
1da80 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  PT and return 0.
1da90 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1daa0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1dab0 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72   .** pPKey2->err
1dac0 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53  Code is set to S
1dad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c  QLITE_NOMEM and,
1dae0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
1daf0 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f  LL, the.** mallo
1db00 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65  c-failed flag se
1db10 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  t on database ha
1db20 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b  ndle (pPKey2->pK
1db30 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a  eyInfo->db)..*/.
1db40 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1db50 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1db60 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Skip(.  int nKey
1db70 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1db80 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1db90 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1dba0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1dbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1dbc0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
1dbd0 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20  Skip            
1dbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1dbf0 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20   true, skip the 
1dc00 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29  first field */.)
1dc10 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1dc40 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1dc50 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1dc60 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc90 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f  next field to co
1dca0 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73  mpare */.  u32 s
1dcb0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  zHdr1;          
1dcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1dcd0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61  ze of record hea
1dce0 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  der in bytes */.
1dcf0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
1dd20 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61  irst type in hea
1dd30 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  der */.  int rc 
1dd40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dd50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1dd60 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  rn value */.  Me
1dd70 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32  m *pRhs = pPKey2
1dd80 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
1dd90 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70   Next field of p
1dda0 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65  PKey2 to compare
1ddb0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1ddc0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1ddd0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f  ->pKeyInfo;.  co
1dde0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ddf0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1de00 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1de10 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d  *)pKey1;.  Mem m
1de20 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53  em1;..  /* If bS
1de30 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  kip is true, the
1de40 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  n the caller has
1de50 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69   already determi
1de60 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1de70 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  st.  ** two elem
1de80 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73  ents in the keys
1de90 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20   are equal. Fix 
1dea0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63  the various stac
1deb0 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20  k variables so. 
1dec0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f   ** that this ro
1ded0 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d  utine begins com
1dee0 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65  paring at the se
1def0 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  cond field. */. 
1df00 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20   if( bSkip ){.  
1df10 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64    u32 s1;.    id
1df20 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69  x1 = 1 + getVari
1df30 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1df40 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20  s1);.    szHdr1 
1df50 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20  = aKey1[0];.    
1df60 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71  d1 = szHdr1 + sq
1df70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1df80 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20  ypeLen(s1);.    
1df90 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b  i = 1;.    pRhs+
1dfa0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1dfb0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1dfc0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1dfd0 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  );.    d1 = szHd
1dfe0 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28  r1;.    if( d1>(
1dff0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1e000 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  { .      pPKey2-
1e010 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1e020 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e030 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1e040 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69   0;  /* Corrupti
1e050 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
1e060 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56  i = 0;.  }..  VV
1e070 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1e080 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1e090 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1e0a0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e0b0 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
1e0c0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1e0d0 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d  ->nField+pPKey2-
1e0e0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1e0f0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1e100 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
1e110 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1e120 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e130 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1e140 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1e150 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e160 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1e170 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1e180 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1e190 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1e1a0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1e1b0 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20  pe;..    /* RHS 
1e1c0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  is an integer */
1e1d0 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
1e1e0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1e1f0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1e200 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1e210 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
1e220 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1e230 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1e240 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1e250 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e260 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1e270 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e290 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e2a0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e2b0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1e2c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e2d0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1e2e0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1e2f0 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  mem1);.        r
1e300 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  c = -sqlite3IntF
1e310 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73  loatCompare(pRhs
1e320 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29  ->u.i, mem1.u.r)
1e330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e340 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1e350 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1e360 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1e370 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1e380 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1e390 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1e3a0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1e3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e3c0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1e3d0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1e3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e3f0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1e400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e410 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1e420 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1e430 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1e440 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1e450 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1e460 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1e470 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e480 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1e490 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1e4a0 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20  s 12 or greater 
1e4b0 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20  are strings and 
1e4c0 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74  blobs (greater t
1e4d0 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  han.        ** n
1e4e0 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31  umbers). Types 1
1e4f0 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72  0 and 11 are cur
1e500 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64  rently "reserved
1e510 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20   for future .   
1e520 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f       ** use", so
1e530 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c   it doesn't real
1e540 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74  ly matter what t
1e550 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f  he results of co
1e560 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20  mparing.        
1e570 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65  ** them to numbe
1e580 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20  ric values are. 
1e590 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1e5a0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1e5b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1e5d0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e5e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e5f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1e600 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1e610 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1e620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e630 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1e640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
1e650 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e  em1.u.r<pRhs->u.
1e660 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1e670 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1e690 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72  m1.u.r>pRhs->u.r
1e6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e6b0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e6d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
1e6e0 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f   = sqlite3IntFlo
1e6f0 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75  atCompare(mem1.u
1e700 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a  .i, pRhs->u.r);.
1e710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e720 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e730 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1e740 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1e750 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1e760 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1e770 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1e780 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1e790 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1e7a0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1e7b0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1e7c0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1e7d0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1e7e0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e7f0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1e800 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1e810 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1e820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e830 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1e840 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1e850 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1e860 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1e870 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1e880 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1e890 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1e8a0 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1e8b0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1e8c0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1e8d0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1e8e0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1e8f0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1e900 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1e910 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e920 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e930 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e940 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1e950 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1e960 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1e970 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
1e980 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
1e990 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1e9a0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
1e9b0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1e9d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
1e9e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1e9f0 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
1ea00 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
1ea10 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
1ea20 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
1ea30 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
1ea40 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
1ea50 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
1ea60 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
1ea70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1ea80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ea90 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1eaa0 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
1eab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1eac0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1ead0 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1eae0 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1eaf0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1eb00 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
1eb10 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
1eb20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1eb30 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
1eb40 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1eb50 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1eb60 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
1eb70 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1eb80 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1eb90 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1eba0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1ebb0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1ebc0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1ebd0 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
1ebe0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1ebf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1ec00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ec10 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
1ec20 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1ec30 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1ec40 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1ec50 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
1ec60 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1ec70 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1ec80 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
1ec90 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1eca0 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
1ecb0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1ecc0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1ecd0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1ece0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1ecf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1ed00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed20 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1ed30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ed40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ed50 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1ed60 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1ed70 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1ed80 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1ed90 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1eda0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1edb0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1edc0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1edd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ede0 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1edf0 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1ee00 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1ee10 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1ee20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1ee30 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1ee40 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1ee50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1ee60 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ee70 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1ee80 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1ee90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1eea0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1eeb0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1eec0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1eed0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1eee0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1eef0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1ef00 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1ef10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ef20 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1ef30 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1ef40 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1ef50 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1ef60 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1ef70 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1ef80 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1ef90 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1efa0 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1efb0 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1efc0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1efd0 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1efe0 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1eff0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1f000 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1f010 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1f020 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1f030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1f040 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1f050 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1f060 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1f070 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1f080 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1f090 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f0a0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1f0b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1f0c0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1f0d0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1f0e0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1f0f0 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1f100 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1f110 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1f120 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1f130 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1f140 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1f150 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1f160 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1f170 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1f180 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1f190 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
1f1a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1f1b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
1f1c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1f1d0 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
1f1e0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1f1f0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1f200 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
1f210 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
1f220 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1f230 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1f240 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f250 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1f260 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1f270 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1f280 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1f290 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1f2a0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1f2b0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1f2c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f2d0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1f2e0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1f2f0 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
1f300 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f310 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1f320 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1f330 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f340 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1f350 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1f360 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1f370 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
1f380 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
1f390 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1f3a0 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
1f3b0 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1f3c0 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1f3d0 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
1f3e0 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
1f3f0 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
1f400 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
1f410 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
1f420 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
1f430 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
1f440 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
1f450 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
1f460 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
1f470 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
1f480 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
1f490 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1f4a0 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
1f4b0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1f4c0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1f4d0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1f4e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1f4f0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
1f500 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
1f510 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
1f520 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1f530 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
1f540 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
1f550 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
1f560 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
1f570 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
1f580 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
1f590 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20  64 x;.  i64 v = 
1f5a0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1f5b0 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  u.i;.  i64 lhs;.
1f5c0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
1f5d0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1f5e0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
1f5f0 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
1f600 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
1f610 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
1f620 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
1f630 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1f640 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1f650 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
1f660 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1f670 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1f680 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1f690 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1f6a0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f6b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f6c0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
1f6d0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
1f6e0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1f6f0 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
1f700 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1f710 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f720 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f730 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f740 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1f750 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1f760 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1f770 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1f780 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1f790 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1f7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f7b0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1f7c0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1f7d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1f7e0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1f7f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f800 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
1f810 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
1f820 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f830 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f840 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1f850 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1f860 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1f870 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
1f880 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1f890 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1f8a0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1f8b0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1f8c0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1f8d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f8e0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
1f8f0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1f900 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1f910 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1f920 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f930 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1f940 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1f950 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
1f960 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
1f970 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f980 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f990 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f9a0 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
1f9b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1f9c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
1f9d0 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
1f9e0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1f9f0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
1fa00 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
1fa10 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
1fa20 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
1fa30 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
1fa40 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
1fa50 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
1fa60 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
1fa70 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
1fa80 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
1fa90 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
1faa0 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
1fab0 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
1fac0 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
1fad0 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
1fae0 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
1faf0 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
1fb00 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
1fb10 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
1fb20 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
1fb30 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
1fb40 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
1fb50 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
1fb60 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
1fb70 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
1fb80 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
1fb90 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
1fba0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1fbb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1fbc0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fbd0 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
1fbe0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1fbf0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1fc00 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1fc10 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
1fc20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20   }..  if( v>lhs 
1fc30 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1fc40 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
1fc50 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
1fc60 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1fc70 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
1fc80 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1fc90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
1fca0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1fcb0 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1fcc0 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
1fcd0 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
1fce0 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
1fcf0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1fd00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1fd10 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1fd20 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1fd30 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1fd40 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1fd50 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1fd60 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
1fd70 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
1fd80 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
1fd90 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
1fda0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1fdb0 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
1fdc0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
1fdd0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1fde0 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
1fdf0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
1fe00 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1fe10 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1fe20 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fe30 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
1fe40 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1fe50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1fe60 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1fe70 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1fe80 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fe90 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1fea0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1feb0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1fec0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1fed0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
1fee0 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
1fef0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1ff00 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
1ff10 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
1ff20 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1ff30 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
1ff40 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1ff50 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1ff60 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
1ff70 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1ff80 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1ff90 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1ffa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1ffb0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1ffc0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1ffd0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1ffe0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1fff0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
20000 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
20010 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
20020 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
20030 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
20040 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
20050 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
20060 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  vdbeAss
20070 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
20080 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
20090 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
200a0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
200b0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
200c0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
200d0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
200e0 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
200f0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
20100 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
20110 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
20120 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
20130 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
20140 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
20150 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
20160 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
20170 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
20180 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
20190 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
201a0 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
201b0 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
201c0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
201d0 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
201e0 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
201f0 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
20200 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
20210 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
20220 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
20230 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20250 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
20260 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
20270 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
20280 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
20290 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
202a0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
202b0 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
202c0 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
202d0 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
202e0 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
202f0 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
20300 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
20310 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
20320 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
20330 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
20340 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
20350 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20360 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
20370 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20380 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
20390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
203a0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
203b0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
203c0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
203d0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
203e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
203f0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
20400 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20410 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
20420 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
20430 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
20440 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
20450 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
20460 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20470 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
20480 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20490 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
204a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
204b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
204c0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
204d0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
204e0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
204f0 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
20500 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20510 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20520 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
20530 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
20540 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20550 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
20560 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
20570 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
20580 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
20590 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
205a0 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
205b0 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
205c0 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
205d0 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
205e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
205f0 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
20600 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
20610 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20620 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
20630 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
20640 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
20650 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
20660 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
20670 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
20680 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
20690 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
206a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
206b0 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
206c0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
206d0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
206e0 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
206f0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20700 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
20710 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
20720 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
20730 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
20740 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
20750 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
20760 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
20770 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
20780 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
20790 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
207a0 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
207b0 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
207c0 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
207d0 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
207e0 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
207f0 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
20800 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20810 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
20820 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
20830 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
20840 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
20850 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
20860 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
20870 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
20880 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
20890 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
208a0 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
208b0 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
208c0 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
208d0 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
208e0 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
208f0 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
20900 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
20910 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
20920 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
20930 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
20940 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
20950 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
20960 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
20970 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
20980 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
20990 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
209a0 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
209b0 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
209c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
209d0 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
209e0 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
209f0 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
20a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a10 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
20a20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
20a30 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
20a40 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
20a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20a60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
20a70 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
20a80 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
20a90 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
20aa0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
20ab0 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
20ac0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
20ad0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
20ae0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
20af0 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
20b00 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
20b10 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
20b20 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
20b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
20b40 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20b50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20b60 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
20b70 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
20b80 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
20b90 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20ba0 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
20bb0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
20bc0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
20bd0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
20be0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
20bf0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
20c00 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
20c10 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
20c20 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
20c30 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
20c40 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20c50 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
20c60 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
20c70 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
20c80 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
20c90 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
20ca0 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
20cb0 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
20cc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
20cd0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
20ce0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
20cf0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
20d00 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
20d10 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
20d20 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
20d30 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
20d40 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
20d50 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
20d60 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
20d70 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
20d80 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
20d90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20da0 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
20db0 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
20dc0 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
20dd0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
20de0 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
20df0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20e00 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
20e10 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
20e20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
20e30 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
20e40 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
20e50 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
20e60 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
20e70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
20e80 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
20e90 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
20ea0 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
20eb0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
20ec0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
20ed0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
20ee0 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
20ef0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
20f00 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
20f10 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
20f20 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
20f30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
20f40 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
20f50 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
20f60 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
20f70 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
20f80 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
20f90 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
20fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
20fb0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
20fc0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
20fd0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
20fe0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
20ff0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
21000 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
21010 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
21020 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
21030 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
21040 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21050 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
21060 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
21070 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
21080 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
21090 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
210a0 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
210b0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
210c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
210d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
210e0 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
210f0 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
21100 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
21110 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21120 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
21130 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
21140 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
21150 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
21160 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21170 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
21180 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
21190 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
211a0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
211b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
211c0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
211d0 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
211e0 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
211f0 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
21200 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
21210 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
21220 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
21230 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
21240 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
21250 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
21260 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21270 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
21280 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
21290 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
212a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
212b0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
212c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
212d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
212e0 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
212f0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
21300 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
21310 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
21320 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
21330 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
21340 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
21350 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
21360 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
21370 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
21380 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
21390 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
213a0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
213b0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
213c0 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
213d0 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
213e0 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
213f0 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
21400 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
21410 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
21420 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
21430 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21440 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
21450 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
21460 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
21470 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
21480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
21490 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
214a0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
214b0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
214c0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
214d0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
214e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
214f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21500 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
21510 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
21520 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
21530 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
21540 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
21550 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
21560 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
21570 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
21580 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
21590 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
215a0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
215b0 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
215c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
215d0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
215e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
215f0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
21600 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
21610 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
21620 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
21630 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
21640 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
21650 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
21660 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
21670 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
21680 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
21690 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
216a0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
216b0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
216c0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
216d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
216e0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
216f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21700 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
21710 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
21720 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
21730 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
21740 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
21750 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
21760 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
21770 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
21780 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
21790 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
217a0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
217b0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
217c0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
217d0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
217e0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
217f0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
21800 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
21810 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
21820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21830 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
21840 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
21850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21860 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
21870 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
21880 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
21890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
218a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
218b0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
218c0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
218d0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
218e0 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
218f0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
21900 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
21910 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
21920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21930 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
21940 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
21950 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
21960 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
21970 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
21980 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
21990 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
219a0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
219b0 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
219c0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
219d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
219e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
219f0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
21a00 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
21a10 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
21a20 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
21a30 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
21a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
21a50 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
21a60 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
21a70 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
21a80 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
21a90 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
21aa0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
21ab0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
21ac0 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
21ad0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
21ae0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
21af0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
21b00 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
21b10 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
21b20 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
21b30 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
21b40 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
21b50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21b60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21b70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
21b80 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
21b90 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
21ba0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
21bb0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
21bc0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
21bd0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
21be0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21bf0 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
21c00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21c10 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
21c20 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
21c30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
21c40 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
21c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21c60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
21c70 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
21c80 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
21c90 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
21ca0 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
21cb0 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
21cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
21cd0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
21ce0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
21cf0 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
21d00 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
21d10 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
21d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21d30 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
21d40 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
21d50 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
21d60 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
21d70 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
21d80 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
21d90 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
21da0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
21db0 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
21dc0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
21dd0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
21de0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
21df0 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
21e00 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
21e10 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
21e20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
21e30 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
21e40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
21e50 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21e60 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
21e70 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
21e80 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
21e90 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
21ea0 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
21eb0 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
21ec0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
21ed0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
21ee0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
21ef0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
21f00 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
21f10 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
21f20 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
21f30 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
21f40 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
21f50 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
21f60 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
21f70 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
21f80 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
21f90 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
21fa0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
21fb0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
21fc0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
21fd0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
21fe0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
21ff0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
22000 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
22010 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22020 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
22030 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
22040 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
22050 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
22060 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
22070 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
22080 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
22090 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
220a0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
220b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
220c0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
220d0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
220e0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
220f0 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
22100 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
22110 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
22120 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
22130 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
22140 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
22150 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
22160 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
22170 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
22180 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
22190 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
221a0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
221b0 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
221c0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
221d0 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
221e0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
221f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
22200 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
22210 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
22220 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
22230 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
22240 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
22250 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
22260 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
22270 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
22280 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
22290 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
222a0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
222b0 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
222c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
222d0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
222e0 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
222f0 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
22300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22310 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
22320 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
22330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
22340 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
22350 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
22360 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
22370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
22380 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
22390 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
223a0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
223b0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
223c0 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
223d0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
223e0 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
223f0 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
22400 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
22410 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
22420 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
22430 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
22440 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
22450 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
22460 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
22470 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
22480 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
22490 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
224a0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
224b0 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
224c0 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
224d0 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
224e0 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
224f0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
22500 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22510 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
22520 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
22530 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
22540 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
22550 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
22560 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
22570 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
22580 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
22590 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
225a0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
225b0 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
225c0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
225d0 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
225e0 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
225f0 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
22600 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
22610 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c  b *pVtab){.  sql
22620 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
22630 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
22640 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
22650 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
22660 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
22670 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
22680 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
22690 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
226a0 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
226b0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23  zErrMsg = 0;.}.#
226c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
226d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
226e0 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
226f0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
22700 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a  DATE_HOOK../*.**
22710 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
22720 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
22730 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79  ULL, release any
22740 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
22750 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
22760 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
22770 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d  s in the p->aMem
22780 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66  [] array. Also f
22790 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64  ree the Unpacked
227a0 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
227b0 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e  ure itself, usin
227c0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
227d0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
227e0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
227f0 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52  o free UnpackedR
22800 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73  ecord structures
22810 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
22820 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52   the vdbeUnpackR
22830 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
22840 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70   found in vdbeap
22850 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  i.c..*/.static v
22860 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61  oid vdbeFreeUnpa
22870 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  cked(sqlite3 *db
22880 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
22890 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
228a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
228b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46  for(i=0; i<p->nF
228c0 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
228d0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
228e0 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
228f0 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c   if( pMem->zMall
22900 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  oc ) sqlite3Vdbe
22910 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
22920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22930 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
22940 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
22950 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
22960 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
22970 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
22980 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
22990 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
229a0 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
229b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
229c0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
229d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
229e0 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
229f0 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
22a00 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
22a10 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
22a20 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
22a30 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
22a40 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
22a50 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
22a60 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
22a70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
22a80 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
22a90 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
22aa0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ac0 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
22ad0 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
22ae0 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
22af0 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
22b00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
22b10 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
22b20 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
22b30 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
22b60 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
22b70 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
22b80 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
22b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
22ba0 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
22bb0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
22be0 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
22bf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22c00 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
22c10 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
22c20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
22c50 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
22c60 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22c70 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
22c80 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
22c90 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
22ca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
22cb0 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
22cc0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
22cd0 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  u8 fakeSortOrder
22ce0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
22cf0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
22d00 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
22d10 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
22d20 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
22d30 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
22d40 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
22d50 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
22d60 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65  [iReg].u.i;.  }e
22d70 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d  lse{.    iKey2 =
22d80 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61   iKey1;.  }..  a
22d90 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
22da0 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
22db0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
22dc0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
22dd0 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
22de0 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
22df0 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
22e00 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
22e10 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
22e20 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
22e30 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
22e40 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
22e50 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
22e60 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
22e70 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
22e80 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
22e90 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
22ea0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
22eb0 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
22ec0 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
22ed0 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
22ee0 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
22ef0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
22f00 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
22f10 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
22f20 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
22f30 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 50 4b  .  preupdate.iPK
22f40 65 79 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ey = pTab->iPKey
22f50 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
22f60 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
22f70 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
22f80 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
22f90 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
22fa0 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
22fb0 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
22fc0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
22fd0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
22fe0 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
22ff0 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
23000 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
23010 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70  (db, preupdate.p
23020 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62  Unpacked);.  vdb
23030 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
23040 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77  , preupdate.pNew
23050 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28  Unpacked);.  if(
23060 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20   preupdate.aNew 
23070 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23080 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
23090 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  r->nField; i++){
230a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
230b0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72  beMemRelease(&pr
230c0 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29  eupdate.aNew[i])
230d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
230e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
230f0 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
23100 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
23110 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
23120 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.