/ Hex Artifact Content
Login

Artifact b660c995256e3d3e2cb47ccd20b82a1c342fa093:


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 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
08e0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08f0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0900: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0910: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0920: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0930: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0940: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0950: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0960: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
0970: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
0980: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
0990: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09b0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09c0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09e0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a00: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a10: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a20: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a30: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a50: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a60: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0ac0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0ad0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0ae0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0af0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b00: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b10: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b20: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b40: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b50: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b60: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0b70: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0b80: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0b90: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0ba0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0bb0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bc0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0bd0: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0be0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0bf0: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c00: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c10: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c20: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c30: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c40: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c50: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c60: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0c70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c80: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0c90: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0ca0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0cb0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cc0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0cd0: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0ce0: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d10: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d20: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d40: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d50: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d60: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0d70: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d80: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0d90: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0da0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0db0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0dc0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0dd0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0de0: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0df0: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e00: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e20: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e30: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e50: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0e70: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0e80: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0e90: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0eb0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0ed0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0ee0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0ef0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f00: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f10: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f20: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f30: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f40: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f50: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f60: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0f70: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0f80: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0f90: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fa0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fb0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0fc0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
0fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0fe0: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
0ff0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1000: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1010: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1020: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1030: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1040: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1050: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1060: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1070: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1080: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1090: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10c0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
10d0: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
10e0: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
10f0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1100: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1110: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1120: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1130: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1150: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1160: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1170: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1180: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1190: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
11a0: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
11b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
11c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
11d0: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
11e0: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
11f0: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b  Alloc<=p->nOp );
1200: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72  .  if( growOpArr
1210: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72  ay(p, 1) ) retur
1220: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
1230: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1240: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
1250: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1260: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1270: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1280: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1290: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
12a0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
12b0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
12c0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
12d0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
12e0: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
12f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1300: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1310: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
1320: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
1330: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1340: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74  oc<=i ){.    ret
1350: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f  urn growOp3(p, o
1360: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1370: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
1380: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
1390: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
13a0: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
13b0: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
13c0: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
13d0: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
13e0: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
13f0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
1400: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
1410: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
1420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
1430: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
1440: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1470: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
1480: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1490: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14a0: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
14b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
14c0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
14d0: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
14e0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14f0: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1500: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1510: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
1520: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
1530: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
1540: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1550: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
1560: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1570: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1580: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1590: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
15a0: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
15b0: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
15c0: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
15d0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
15e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
15f0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1600: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
1610: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
1620: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1630: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1640: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1650: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1660: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1670: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1680: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1690: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
16a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
16b0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
16c0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
16d0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
16e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
16f0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1700: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1710: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1720: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1730: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1750: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1760: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
17a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17b0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17c0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
17d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17e0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
17f0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
1800: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
1810: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1820: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1830: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1840: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1850: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1860: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1870: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1880: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1890: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
18a0: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
18b0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
18c0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
18d0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
18e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
18f0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1900: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
1910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1920: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1930: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1940: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1950: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1960: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1970: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1980: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1990: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
19a0: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
19b0: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
19c0: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
19d0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
19e0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
19f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1a00: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1a10: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1a20: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1a30: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1a40: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1a50: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1a60: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1a70: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1a80: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1a90: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1aa0: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1ab0: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1ac0: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ad0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1ae0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1af0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1b10: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62  dbeMultiLoad(Vdb
1b20: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b40: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  pes, ...){.  va_
1b50: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69  list ap;.  int i
1b60: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61  ;.  char c;.  va
1b70: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65  _start(ap, zType
1b80: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  s);.  for(i=0; (
1b90: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d  c = zTypes[i])!=
1ba0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
1bb0: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20   c=='s' ){.     
1bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1bd0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1be0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1bf0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1c00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20  e3VdbeAddOp2(p, 
1c10: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a  z==0 ? OP_Null :
1c20: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1c30: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 20 20  iDest++);.      
1c40: 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 33 56  if( z ) sqlite3V
1c50: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1c60: 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  ddr, z, 0);.    
1c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c80: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ca0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cb0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cc0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1ce0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1cf0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d00: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d10: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d20: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d40: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d60: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d70: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d80: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d90: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1da0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dc0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1dd0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1df0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e00: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e10: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e30: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e40: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e50: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e60: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e70: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e80: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1e90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1ea0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ec0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ed0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ee0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f00: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f10: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f20: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f30: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f40: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f50: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f60: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f80: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1f90: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fc0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fe0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1ff0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2000: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2010: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2020: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2030: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2040: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2050: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2060: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2070: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2080: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2090: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20c0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20d0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20e0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
20f0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2110: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2120: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2130: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2140: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2150: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2160: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2170: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2180: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2190: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21a0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21b0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21c0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21d0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
21f0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2200: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2210: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2220: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2240: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2250: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2260: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2280: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
2290: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22a0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22b0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
22c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
22d0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
22e0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
22f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2310: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
2320: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
2330: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
2340: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
2350: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
2360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
2370: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2380: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2390: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
23a0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
23d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
23e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
23f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
2420: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2440: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2450: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2460: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2470: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2490: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
24a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
24d0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
24e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
24f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
2500: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
2510: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2520: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
2530: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2540: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
2550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2570: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2580: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2590: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
25a0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
25b0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
25c0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
25d0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
25e0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
25f0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2600: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2610: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2620: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2630: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2640: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2650: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2660: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2670: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2680: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2690: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
26a0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
26b0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
26c0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
26d0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
26e0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
26f0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2700: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2710: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2720: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2730: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2740: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2750: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2760: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2770: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2780: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2790: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
27a0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
27b0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
27c0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
27d0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
27f0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
2800: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2810: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2820: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
2830: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2840: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2850: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
2860: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
2870: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
2880: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2890: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
28a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
28e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
28f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
2900: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
2910: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
2920: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
2930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2940: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2950: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2960: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2970: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2980: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2990: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
29a0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
29b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
29c0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
29d0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
29f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2a00: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2a10: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2a20: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2a30: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2a40: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2a50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2a70: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2a80: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2a90: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2aa0: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2ab0: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
2ac0: 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d  .  p->iFixedOp =
2ad0: 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a   v->nOp - 1;.}..
2ae0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
2af0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2b00: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2b10: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
2b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
2b30: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
2b40: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
2b50: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
2b60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
2b70: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
2b80: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
2b90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
2ba0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
2bb0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
2bc0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2bd0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
2be0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
2bf0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
2c00: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
2c10: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
2c20: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
2c30: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
2c40: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
2c50: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
2c60: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2c70: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
2c80: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
2c90: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
2ca0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2cb0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
2cc0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
2cf0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
2d00: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
2d10: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
2d20: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
2d30: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
2d40: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
2d50: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
2d60: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2d70: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
2d80: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2d90: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
2da0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
2db0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
2dc0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
2dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
2de0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
2df0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
2e00: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
2e10: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2e20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2e30: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2e40: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e60: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2e70: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2e80: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2ea0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2eb0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
2ec0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
2ef0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
2f00: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
2f10: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2f20: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2f30: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2f40: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2f50: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2f60: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2f70: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2f80: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2f90: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2fa0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2fb0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
2fc0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
2fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fe0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
2ff0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
3000: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
3010: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
3020: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
3030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
3040: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
3050: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
3060: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
3070: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
3080: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
3090: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
30a0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
30b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
30c0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
30d0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
30e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
30f0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
3100: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
3110: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
3120: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
3130: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
3140: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
3150: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
3160: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
3170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3180: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
3190: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
31a0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
31b0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
31c0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
31d0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
31e0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
31f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
3200: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
3210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3220: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
3230: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
3240: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
3250: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3260: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3270: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
3280: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
3290: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
32a0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
32b0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
32c0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
32d0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
32e0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
32f0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
3300: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
3310: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
3320: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
3330: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
3340: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
3350: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
3360: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
3370: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
3380: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
3390: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
33a0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
33b0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
33c0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
33d0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
33e0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
33f0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3400: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3410: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
3420: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
3430: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
3440: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
3450: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
3460: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
3470: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
3480: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
3490: 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f  ateTable and OP_
34a0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66  InitCoroutine (f
34b0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
34c0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
34d0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
34e0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
34f0: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3500: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3510: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3520: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3530: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3540: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3550: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3560: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3580: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3590: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
35a0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
35b0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
35c0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
35d0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
35e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
35f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3600: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3610: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3620: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3630: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3640: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3650: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3660: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3670: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3680: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3690: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
36a0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
36b0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
36c0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
36d0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
36e0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
36f0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3700: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3710: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3720: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3730: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3740: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3750: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3770: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3780: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3790: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
37a0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
37b0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
37c0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
37d0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
37e0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
37f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3800: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3810: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3820: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3830: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3840: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3850: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
3860: 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74 65  able ) hasCreate
3870: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
3880: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
3890: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
38a0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38b0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
38c0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
38d0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
38e0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
38f0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
3900: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
3910: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
3920: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
3930: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
3940: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
3950: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
3960: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
3970: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
3980: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
3990: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
39a0: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
39b0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
39c0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
39d0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
39e0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
39f0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
3a00: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
3a10: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
3a20: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
3a30: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
3a40: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
3a50: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
3a60: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
3a70: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
3a80: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
3a90: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
3aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3ab0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
3ac0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
3ad0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
3ae0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
3af0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
3b00: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
3b10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3b20: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
3b30: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
3b40: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
3b50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
3b60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3b70: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
3b80: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
3b90: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
3ba0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
3bb0: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
3bc0: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
3bd0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
3be0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
3bf0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
3c00: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
3c10: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
3c20: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
3c30: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
3c40: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
3c50: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
3c60: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
3c70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3c80: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
3c90: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
3ca0: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
3cb0: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
3cc0: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
3cd0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
3ce0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
3cf0: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
3d00: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
3d10: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
3d20: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
3d30: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
3d40: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
3d50: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
3d60: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
3d70: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
3d80: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
3d90: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
3da0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
3db0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
3dc0: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f  oring labels..*/
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3de0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3df0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3e00: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3e10: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3e20: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3e30: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3e50: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3e60: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
3e70: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
3e80: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
3e90: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
3ea0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
3eb0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
3ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3ed0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3ee0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3ef0: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3f00: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3f10: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3f20: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3f30: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3f40: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3f50: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3f60: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
3f70: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
3f80: 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  saction: {.     
3f90: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
3fa0: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
3fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
3fc0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
3fd0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3fe0: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
3ff0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76       case OP_Sav
4000: 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20  epoint: {.      
4010: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4020: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
4030: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
4040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
4050: 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  AL.      case OP
4060: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
4070: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
4080: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
4090: 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
40a0: 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ode: {.        p
40b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
40c0: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
40d0: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
40e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4110: 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  E.      case OP_
4120: 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  VUpdate: {.     
4130: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4140: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4150: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
4160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4170: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4180: 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20  OP_VFilter: {.  
4190: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
41a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
41b0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
41c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
41d0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
41e0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
41f0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
4200: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ].p1;.        if
4210: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
4220: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20  MaxArgs = n;.   
4230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4240: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
4250: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20   case OP_Next:. 
4260: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4270: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63  tIfOpen:.      c
4280: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
4290: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t: {.        pOp
42a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
42b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
42c0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
42d0: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
42e0: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
42f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4300: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20   case OP_Prev:. 
4310: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
4320: 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  vIfOpen: {.     
4330: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4340: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4350: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4360: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4370: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
4380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4390: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
43a0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73  pOp->opflags = s
43b0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
43c0: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20  erty[opcode];.  
43d0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
43e0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
43f0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
4400: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4410: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50  t( -1-pOp->p2<pP
4420: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  arse->nLabel );.
4430: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4440: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
4450: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
4460: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4470: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
4480: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
4490: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
44a0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
44b0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
44c0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
44d0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
44e0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
44f0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
4500: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
4510: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
4520: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4530: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4540: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
4550: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4560: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
4570: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4580: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4590: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
45a0: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
45b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
45c0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
45d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
45e0: 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61  ray of opcodes a
45f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
4600: 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  * the Vdbe passe
4610: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4620: 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74  rgument. It is t
4630: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
4640: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
4650: 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
4660: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74  returned array t
4670: 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  o be eventually 
4680: 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20  freed using the 
4690: 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72  .** vdbeFreeOpAr
46a0: 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ray() function..
46b0: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
46c0: 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73  urning, *pnOp is
46d0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
46e0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
46f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
4700: 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70   array. Also, *p
4710: 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74  nMaxArg is set t
4720: 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  o the larger of 
4730: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
4740: 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75  e and .** the nu
4750: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4760: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  in the Vdbe.apAr
4770: 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72  g[] array requir
4780: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
4790: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70  e .** returned p
47a0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f  rogram..*/.VdbeO
47b0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
47c0: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
47d0: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
47e0: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
47f0: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
4800: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
4810: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
4820: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
4830: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
4840: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4850: 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63  tree() was not c
4860: 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d  alled on this VM
4870: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62   */.  assert( Db
4880: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4890: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20  treeMask) );..  
48a0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
48b0: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
48c0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
48d0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
48e0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
48f0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
4900: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
4910: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
4920: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
4930: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
4940: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
4950: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
4960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4970: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
4980: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
4990: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
49a0: 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e  *aOp, int iLinen
49b0: 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  o){.  int addr, 
49c0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
49d0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
49e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
49f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4a00: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4a10: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4a20: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4a30: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4a40: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4a50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4a60: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4a70: 70 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  p;.  pOut = &p->
4a80: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72  aOp[addr];.  for
4a90: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
4aa0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
4ab0: 7b 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 61  {.    int p2 = a
4ac0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 70 4f 75 74  Op->p2;.    pOut
4ad0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e  ->opcode = aOp->
4ae0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74  opcode;.    pOut
4af0: 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a  ->p1 = aOp->p1;.
4b00: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a      if( p2<0 ){.
4b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4b20: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4b30: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4b40: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4b50: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
4b60: 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   = addr + ADDR(p
4b70: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
4b80: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4b90: 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  p2;.    }.    pO
4ba0: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
4bb0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
4bc0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4bd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
4be0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
4bf0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4c00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4c10: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4c20: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
4c30: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
4c40: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
4c50: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
4c60: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
4c70: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
4c80: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4c90: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4cb0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
4cc0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
4cd0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
4ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4cf0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4d00: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4d10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4d20: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4d30: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  Op;.  return add
4d40: 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  r;.}..#if define
4d50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4d60: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
4d70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
4d80: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
4d90: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
4da0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
4db0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
4dc0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
4dd0: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
4de0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
4e10: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
4e20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
4e30: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
4e40: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4e50: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
4e60: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
4e70: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
4e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4e90: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
4ea0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
4eb0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4ed0: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
4ee0: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
4ef0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
4f20: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
4f30: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
4f40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4f60: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
4f70: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
4f80: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
4f90: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
4fa0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
4fb0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
4fc0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
4fd0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
4fe0: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
4ff0: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
5000: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
5010: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
5020: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
5030: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
5040: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
5050: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
5060: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
5070: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
5080: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
5090: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
50a0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
50b0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
50c0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
50d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
50e0: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
50f0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
5100: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
5110: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
5120: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5130: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
5140: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
5150: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
5160: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5170: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5180: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5190: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
51a0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38  *p, u32 addr, u8
51b0: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
51c0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
51d0: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
51e0: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
51f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5200: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
5210: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5220: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5230: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5240: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
5250: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5260: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
5270: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5280: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5290: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
52a0: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
52b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52c0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
52d0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
52e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
52f0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5300: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
5310: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5320: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
5330: 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  p5){.  sqlite3Vd
5340: 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e 70  beGetOp(p,-1)->p
5350: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
5360: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
5370: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
5380: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
5390: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
53a0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
53b0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
53c0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
53d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
53e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
53f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5400: 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  r){.  p->pParse-
5410: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
5420: 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  Op - 1;.  sqlite
5430: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5440: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5450: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5460: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5470: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5480: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5490: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
54a0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
54b0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
54c0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
54d0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
54e0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
54f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5500: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5510: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
5520: 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  & (pDef->funcFla
5530: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5540: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5560: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
5570: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
5580: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5590: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
55a0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
55b0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
55c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
55d0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
55e0: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
55f0: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
5600: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
5610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
5620: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
5630: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
5640: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
5650: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5660: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5670: 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f 63  (db, ((sqlite3_c
5680: 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 75  ontext*)p4)->pFu
5690: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nc);.        /* 
56a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
56b0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
56c0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
56d0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
56e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
56f0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
5700: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
5710: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
5720: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
5730: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5740: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5750: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5760: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
5770: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5780: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5790: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
57a0: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
57b0: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
57c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
57e0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
57f0: 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  S.      case P4_
5800: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EXPR: {.        
5810: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5820: 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29  e(db, (Expr*)p4)
5830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5840: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
5850: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
5860: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
5870: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
5880: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
5890: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
58a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
58c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
58d0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
58e0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
58f0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
5900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5920: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
5930: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5940: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
5950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
5960: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
5970: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
5980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5990: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
59a0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
59b0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
59c0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
59d0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
59e0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  c);.          sq
59f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a00: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
5a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5a30: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
5a40: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5a50: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5a60: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
5a70: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
5a80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
5ab0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
5ac0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
5ad0: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
5ae0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
5af0: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
5b00: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
5b10: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
5b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
5b30: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
5b40: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
5b50: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5b60: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5b70: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
5b80: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
5b90: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
5ba0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
5bb0: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
5bc0: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
5bd0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5be0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5bf0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
5c00: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5c10: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
5c20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5c30: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
5c40: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
5c50: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5c60: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
5c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
5c80: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
5c90: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
5ca0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5cb0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
5cc0: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
5cd0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
5ce0: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
5cf0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
5d00: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
5d10: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
5d20: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
5d30: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
5d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
5d50: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
5d60: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
5d70: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
5d80: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
5d90: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
5da0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
5db0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5dc0: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
5dd0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
5de0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5df0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
5e00: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5e10: 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d  ){.  if( addr<p-
5e20: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >nOp ){.    Vdbe
5e30: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5e40: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
5e50: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5e60: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
5e70: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5e80: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
5e90: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
5ea0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
5eb0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
5ec0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28  OP_Noop;.    if(
5ed0: 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20   addr==p->nOp-1 
5ee0: 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a  ) p->nOp--;.  }.
5ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
5f00: 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22  last opcode is "
5f10: 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  op" and it is no
5f20: 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  t a jump destina
5f30: 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  tion,.** then re
5f40: 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e  move it.  Return
5f50: 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c   true if and onl
5f60: 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77  y if an opcode w
5f70: 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  as removed..*/.i
5f80: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
5f90: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
5fa0: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
5fb0: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31  .  if( (p->nOp-1
5fc0: 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  )>(p->pParse->iF
5fd0: 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f  ixedOp) && p->aO
5fe0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
5ff0: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71  de==op ){.    sq
6000: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6010: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
6020: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  1);.    return 1
6030: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
6050: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6060: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
6070: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
6080: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
6090: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
60a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
60b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
60c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
60d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
60e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
60f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
6100: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
6110: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
6120: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
6130: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
6140: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
6150: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
6160: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
6170: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
6180: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
6190: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
61a0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
61b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
61c0: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
61d0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
61e0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
61f0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
6200: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
6210: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
6220: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
6230: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
6240: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
6250: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
6260: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
6270: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
6280: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
6290: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
62a0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
62b0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
62c0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
62d0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
62e0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
62f0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
6300: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
6310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
6320: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
6330: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6340: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
6350: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
6360: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
6370: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
6380: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
6390: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
63a0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
63b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
63c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
63d0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
63e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
63f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
6400: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
6410: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
6420: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6430: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
6440: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
6450: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
6460: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
6470: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
6480: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
6490: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
64a0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
64b0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
64c0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
64d0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
64e0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
64f0: 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r];.  assert( pO
6500: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
6510: 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  TUSED.       || 
6520: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6530: 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20  INT32.       || 
6540: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6550: 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65  KEYINFO );.  fre
6560: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
6570: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6580: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
6590: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
65a0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
65b0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
65c0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
65d0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
65e0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
65f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
6600: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
6610: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
6620: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
6630: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
6640: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6650: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
6660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
6680: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
6690: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
66a0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
66b0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
66c0: 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  O ){.    pOp->p4
66d0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
66e0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
66f0: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23   = P4_KEYINFO;.#
6700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6710: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
6720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
6730: 50 34 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 2f  P4_EXPR ){.    /
6740: 2a 20 52 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * Responsibility
6750: 20 66 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68   for deleting th
6760: 65 20 45 78 70 72 20 74 72 65 65 20 69 73 20 68  e Expr tree is h
6770: 61 6e 64 65 64 20 6f 76 65 72 20 74 6f 20 74 68  anded over to th
6780: 65 0a 20 20 20 20 2a 2a 20 56 44 42 45 20 62 79  e.    ** VDBE by
6790: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
67a0: 20 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f    The caller sho
67b0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
67c0: 20 69 6e 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20   invoked.    ** 
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29  sqlite3ExprDup()
67e0: 20 6f 72 20 77 68 61 74 65 76 65 72 20 6f 74 68   or whatever oth
67f0: 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  er routine is ne
6800: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a  eded to make a .
6810: 20 20 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63      ** private c
6820: 6f 70 79 20 6f 66 20 74 68 65 20 74 72 65 65 2e  opy of the tree.
6830: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
6840: 70 45 78 70 72 20 3d 20 28 45 78 70 72 2a 29 7a  pExpr = (Expr*)z
6850: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
6860: 79 70 65 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23  ype = P4_EXPR;.#
6870: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66  endif.  }else if
6880: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
6890: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
68a0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
68b0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
68c0: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
68d0: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
68e0: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
68f0: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
6900: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
6910: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
6920: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
6930: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
6940: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
6950: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
6960: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
6970: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
6980: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6990: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
69a0: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
69b0: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
69c0: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
69d0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
69e0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
69f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f  .** Set the P4 o
6a00: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
6a10: 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65  tly added opcode
6a20: 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   to the KeyInfo 
6a30: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  for the.** index
6a40: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
6a50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
6a60: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
6a70: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
6a80: 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  dx){.  Vdbe *v =
6a90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6aa0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
6ac0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
6ad0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6ae0: 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  -1, (char*)sqlit
6af0: 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
6b00: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a  (pParse, pIdx),.
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
6b30: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
6b40: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6b50: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a  IN_COMMENTS./*.*
6b60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
6b70: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
6b80: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
6b90: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
6ba0: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
6bb0: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
6bc0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
6bd0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
6be0: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
6bf0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
6c00: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
6c10: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
6c20: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
6c30: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
6c40: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
6c50: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
6c60: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
6c70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6c80: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
6c90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6ca0: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
6cb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6cc0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
6cd0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
6ce0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
6cf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6d00: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
6d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6d20: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
6d30: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
6d40: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
6d50: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
6d60: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
6d70: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
6d80: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
6d90: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
6da0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
6db0: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
6dc0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
6dd0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6de0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6df0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6e00: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
6e10: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
6e20: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
6e30: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
6e40: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
6e50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
6e60: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
6e70: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6e80: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
6e90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
6ea0: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
6eb0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
6ec0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
6ed0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
6ee0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
6ef0: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
6f00: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
6f10: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
6f20: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
6f30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
6f40: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
6f50: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
6f60: 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c  lue if the iSrcL
6f70: 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ine field for th
6f80: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64  e previously cod
6f90: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
6fa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6fb0: 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72  dbeSetLineNumber
6fc0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c  (Vdbe *v, int iL
6fd0: 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ine){.  sqlite3V
6fe0: 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e  dbeGetOp(v,-1)->
6ff0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
7000: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7010: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
7020: 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  GE */../*.** Ret
7030: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
7040: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
7050: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
7060: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
7070: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
7080: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
7090: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
70a0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
70b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
70c0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
70d0: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
70e0: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
70f0: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
7100: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
7110: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
7120: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
7130: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
7140: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
7150: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
7160: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
7170: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
7180: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
7190: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
71a0: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
71b0: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
71c0: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
71d0: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  n OOM fault with
71e0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68  out having to ch
71f0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
7200: 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a  e return from .*
7210: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
7220: 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  s a valid pointe
7230: 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  r.  But because 
7240: 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65  the dummy.opcode
7250: 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20   is 0,.** dummy 
7260: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
7270: 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20  itten to.  This 
7280: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63  is verified by c
7290: 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61  ode inspection a
72a0: 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67  nd.** by running
72b0: 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a   with Valgrind..
72c0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
72d0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
72e0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
72f0: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
7300: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
7310: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
7320: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
7330: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
7340: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
7350: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
7360: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
7370: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
7380: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
7390: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
73a0: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
73b0: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
73c0: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
73d0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
73e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
73f0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
7400: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
7410: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
7420: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
7430: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
7440: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
7450: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
7460: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
7470: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
7480: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
7490: 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mmy;.  }else{.  
74a0: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70    return &p->aOp
74b0: 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23  [addr];.  }.}..#
74c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
74d0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
74e0: 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a  _COMMENTS)./*.**
74f0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
7500: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65  er value for one
7510: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
7520: 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65  rs to the opcode
7530: 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   pOp.** determin
7540: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20  ed by character 
7550: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
7560: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72   translateP(char
7570: 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f   c, const Op *pO
7580: 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27  p){.  if( c=='1'
7590: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
75a0: 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20  1;.  if( c=='2' 
75b0: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32  ) return pOp->p2
75c0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29  ;.  if( c=='3' )
75d0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b   return pOp->p3;
75e0: 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20  .  if( c=='4' ) 
75f0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69  return pOp->p4.i
7600: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
7610: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p5;.}../*.** Com
7620: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f  pute a string fo
7630: 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20  r the "comment" 
7640: 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20  field of a VDBE 
7650: 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a  opcode listing..
7660: 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73  **.** The Synops
7670: 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d  is: field in com
7680: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62  ments in the vdb
7690: 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20  e.c source file 
76a0: 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a  gets converted.*
76b0: 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74  * to an extra st
76c0: 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70  ring that is app
76d0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  ended to the sql
76e0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
76f0: 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73  .  In the.** abs
7700: 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f  ence of other co
7710: 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e  mments, this syn
7720: 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68  opsis becomes th
7730: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
7740: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65   opcode..** Some
7750: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63   translation occ
7760: 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  urs:.**.**      
7770: 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22   "PX"      ->  "
7780: 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22  r[X]".**       "
7790: 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b  PX@PY"   ->  "r[
77a0: 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22  X..X+Y-1]"  or "
77b0: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20  r[x]" if y is 0 
77c0: 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50  or 1.**       "P
77d0: 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58  X@PY+1" ->  "r[X
77e0: 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72  ..X+Y]"    or "r
77f0: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a  [x]" if y is 0.*
7800: 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22  *       "PY..PY"
7810: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20    ->  "r[X..Y]" 
7820: 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69       or "r[x]" i
7830: 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63  f y<=x.*/.static
7840: 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d   int displayComm
7850: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20  ent(.  const Op 
7860: 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pOp,     /* The
7870: 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f   opcode to be co
7880: 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e  mmented */.  con
7890: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20  st char *zP4,   
78a0: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62  /* Previously ob
78b0: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72  tained value for
78c0: 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   P4 */.  char *z
78d0: 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57  Temp,       /* W
78e0: 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65  rite result here
78f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20   */.  int nTemp 
7900: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
7910: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
7920: 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63  Temp[] */.){.  c
7930: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
7940: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
7950: 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69   *zSynopsis;.  i
7960: 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e  nt nOpName;.  in
7970: 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e  t ii, jj;.  zOpN
7980: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63  ame = sqlite3Opc
7990: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
79a0: 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20  ode);.  nOpName 
79b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
79c0: 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66  0(zOpName);.  if
79d0: 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d  ( zOpName[nOpNam
79e0: 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e+1] ){.    int 
79f0: 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20  seenCom = 0;.   
7a00: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79   char c;.    zSy
7a10: 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65  nopsis = zOpName
7a20: 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b   += nOpName + 1;
7a30: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
7a40: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
7a50: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
7a60: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
7a70: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
7a80: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
7a90: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
7aa0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
7ab0: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
7ac0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7ad0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7ae0: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
7af0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
7b00: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
7b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7b20: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7b30: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
7b40: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
7b60: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b80: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
7b90: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
7ba0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
7bb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7bc0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7bd0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
7be0: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
7bf0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
7c00: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7c10: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7c30: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
7c40: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7c50: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
7c70: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
7c80: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
7c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
7ca0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
7cb0: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
7cc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7cd0: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
7cf0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
7d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7d10: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
7d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7d30: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7d40: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
7d50: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
7d60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7d70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7d80: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7d90: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
7da0: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
7db0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7dc0: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
7dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7de0: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
7df0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7e00: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e20: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
7e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7e40: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
7e50: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
7e60: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
7e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7e80: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7e90: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
7ea0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
7eb0: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
7ec0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7ed0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
7ee0: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
7ef0: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
7f00: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
7f10: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
7f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
7f30: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7f40: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
7f50: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
7f60: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7f70: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
7f80: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
7f90: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
7fa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
7fb0: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
7fc0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
7fd0: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
7fe0: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
7ff0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8000: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
8010: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
8020: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
8030: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
8040: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
8050: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
8060: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
8070: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
8080: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
8090: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
80a0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74  isplayP4Expr(int
80b0: 20 6e 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54   nTemp, char *zT
80c0: 65 6d 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72  emp, Expr *pExpr
80d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
80e0: 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  *zOp = 0;.  int 
80f0: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
8100: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
8110: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
8120: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8130: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8140: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
8150: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
8160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8170: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
8180: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8190: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
81a0: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
81b0: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
81c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
81d0: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73  TK_NULL:.      s
81e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
81f0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
8200: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ULL");.      bre
8210: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8220: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
8230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8240: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8250: 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d   "r[%d]", pExpr-
8260: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
8270: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8280: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
8290: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
82a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
82b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
82c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
82d0: 20 7a 54 65 6d 70 2c 20 22 72 6f 77 69 64 22 29   zTemp, "rowid")
82e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
82f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8300: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8310: 54 65 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e  Temp, "c%d", (in
8320: 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t)pExpr->iColumn
8330: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8350: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
8360: 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20     zOp = "LT";  
8370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8380: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
8390: 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  zOp = "LE";     
83a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
83b0: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70   TK_GT:      zOp
83c0: 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72   = "GT";      br
83d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
83e0: 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GE:      zOp = 
83f0: 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GE";      break
8400: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
8410: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45  :      zOp = "NE
8420: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8430: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
8440: 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20      zOp = "EQ"; 
8450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8460: 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20  case TK_IS:     
8470: 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20   zOp = "IS";    
8480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8490: 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f  e TK_ISNOT:   zO
84a0: 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62  p = "ISNOT";   b
84b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
84c0: 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d  K_AND:     zOp =
84d0: 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61   "AND";     brea
84e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
84f0: 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f  R:      zOp = "O
8500: 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R";      break;.
8510: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
8520: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22  :    zOp = "ADD"
8530: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8540: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
8550: 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20    zOp = "MUL";  
8560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8570: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a  se TK_MINUS:   z
8580: 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20  Op = "SUB";     
8590: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
85a0: 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20  TK_REM:     zOp 
85b0: 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65  = "REM";     bre
85c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
85d0: 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22  BITAND:  zOp = "
85e0: 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b  BITAND";  break;
85f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8600: 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54  OR:   zOp = "BIT
8610: 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OR";   break;.  
8620: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
8630: 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20     zOp = "DIV"; 
8640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8650: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
8660: 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  zOp = "LSHIFT"; 
8670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8680: 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70   TK_RSHIFT:  zOp
8690: 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72   = "RSHIFT";  br
86a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
86b0: 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20  _CONCAT:  zOp = 
86c0: 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b  "CONCAT";  break
86d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
86e0: 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49  INUS:  zOp = "MI
86f0: 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  NUS";   break;. 
8700: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
8710: 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22  :   zOp = "PLUS"
8720: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
8730: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
8740: 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b   zOp = "BITNOT";
8750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8760: 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f  e TK_NOT:     zO
8770: 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62  p = "NOT";     b
8780: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8790: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d  K_ISNULL:  zOp =
87a0: 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61   "ISNULL";  brea
87b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
87c0: 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e  OTNULL: zOp = "N
87d0: 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
87e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
87f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8800: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8810: 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29  p, "%s", "expr")
8820: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8830: 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b   }..  if( zOp ){
8840: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8850: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8860: 6d 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  mp, "%s(", zOp);
8870: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
8880: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
8890: 0a 20 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61  .    n += displa
88a0: 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c  yP4Expr(nTemp-n,
88b0: 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d   zTemp+n, pExpr-
88c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
88d0: 20 6e 3c 6e 54 65 6d 70 2d 31 20 26 26 20 70 45   n<nTemp-1 && pE
88e0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
88f0: 20 20 20 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20       zTemp[n++] 
8900: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b  = ',';.      n +
8910: 3d 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28  = displayP4Expr(
8920: 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e  nTemp-n, zTemp+n
8930: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
8940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8950: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8960: 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22  mp-n, zTemp+n, "
8970: 29 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )");.  }.  retur
8980: 6e 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  n sqlite3Strlen3
8990: 30 28 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64  0(zTemp);.}.#end
89a0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
89b0: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
89c0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
89d0: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
89e0: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
89f0: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
8a00: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
8a10: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
8a20: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
8a30: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
8a40: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
8a50: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
8a60: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
8a70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
8a80: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
8a90: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
8aa0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
8ab0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
8ac0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
8ad0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
8ae0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
8af0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
8b00: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
8b10: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
8b20: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
8b30: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
8b40: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
8b50: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
8b60: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
8b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8b80: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8b90: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
8ba0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
8bb0: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
8bc0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
8bd0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8be0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
8bf0: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
8c00: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8c10: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
8c20: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
8c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8c40: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
8c50: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
8c60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
8c70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8c80: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
8c90: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
8ca0: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
8cb0: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
8cc0: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
8cd0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
8ce0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8cf0: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
8d00: 65 6d 70 2d 37 20 29 7b 0a 20 20 20 20 20 20 20  emp-7 ){.       
8d10: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
8d20: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
8d30: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
8d40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
8d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d60: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
8d70: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66   ',';.        if
8d80: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8d90: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
8da0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
8db0: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
8dc0: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
8dd0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f  y(&zTemp[i], zCo
8de0: 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ll, n+1);.      
8df0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
8e00: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
8e10: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
8e20: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
8e30: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
8e40: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
8e50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
8e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
8e70: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
8e80: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
8e90: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
8ea0: 78 70 72 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  xpr(nTemp, zTemp
8eb0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29  , pOp->p4.pExpr)
8ec0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ed0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8ee0: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
8ef0: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
8f00: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
8f10: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
8f20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8f30: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28  nTemp, zTemp, "(
8f40: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
8f50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
8f60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8f70: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
8f80: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
8f90: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
8fa0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
8fb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8fc0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
8fd0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
8fe0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
8ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9000: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9010: 5f 44 45 42 55 47 0a 20 20 20 20 63 61 73 65 20  _DEBUG.    case 
9020: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
9030: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
9040: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
9050: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
9060: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9070: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
9080: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
9090: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
90a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
90b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
90c0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
90d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
90e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
90f0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
9100: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
9110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9120: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9130: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
9140: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9150: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
9160: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
9170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9180: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
9190: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
91a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
91b0: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
91c0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
91d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
91e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
91f0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
9200: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
9210: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  p4.pMem;.      i
9220: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
9230: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
9240: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
9250: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
9260: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
9270: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
9280: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9290: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
92a0: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
92b0: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
92c0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
92d0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
92e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9300: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
9310: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
9320: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9330: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
9340: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
9350: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9360: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
9370: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
9380: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
9390: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
93a0: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
93b0: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
93c0: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
93d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
93e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
93f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9400: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
9410: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
9420: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
9430: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
9440: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
9450: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9460: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
9470: 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a  ab:%p", pVtab);.
9480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9490: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
94a0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
94b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
94c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
94d0: 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79  zTemp, "intarray
94e0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
94f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9500: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
9510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9520: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9530: 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29  Temp, "program")
9540: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9550: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9560: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
9570: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
9580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9590: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
95a0: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
95b0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
95c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
95d0: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
95e0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
95f0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
9600: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
9610: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
9620: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
9630: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
9640: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a  PLAY_P4 */../*.*
9650: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
9660: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
9670: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
9680: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
9690: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
96a0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
96b0: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
96c0: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
96d0: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
96e0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
96f0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
9700: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
9710: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
9720: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
9730: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
9740: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
9750: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
9760: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
9770: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
9780: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
9790: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
97a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
97b0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
97c0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
97d0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
97e0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
97f0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
9800: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
9810: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
9820: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
9830: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
9840: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
9850: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
9860: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
9870: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
9880: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
9890: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
98a0: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
98b0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
98c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
98d0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
98e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
98f0: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
9900: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
9910: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
9920: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
9930: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
9940: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
9950: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
9960: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
9970: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
9980: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
9990: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
99a0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
99b0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
99c0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
99d0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
99e0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
99f0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
9a00: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
9a10: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
9a20: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
9a30: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
9a40: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
9a50: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
9a60: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
9a70: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
9a80: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
9a90: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
9aa0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
9ab0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
9ac0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
9ad0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
9ae0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
9af0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
9b00: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
9b10: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
9b20: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
9b30: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
9b40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
9b50: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
9b60: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
9b70: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
9b80: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
9b90: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
9ba0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
9bb0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
9bc0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
9bd0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
9be0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
9bf0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
9c00: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
9c10: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
9c20: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
9c30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
9c40: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
9c50: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
9c60: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
9c70: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
9c80: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
9c90: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
9ca0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
9cb0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
9cc0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
9cd0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
9ce0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
9cf0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
9d00: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
9d10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
9d20: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
9d30: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
9d40: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
9d50: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
9d60: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
9d70: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
9d80: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
9d90: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
9da0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
9db0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
9dc0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
9dd0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
9de0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
9df0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
9e00: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
9e10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e20: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
9e30: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
9e40: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
9e50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9e60: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9e70: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
9e80: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
9e90: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
9ea0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
9eb0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
9ec0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9ed0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
9ee0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
9ef0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
9f00: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
9f10: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
9f20: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
9f30: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
9f40: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
9f50: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
9f60: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
9f70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
9f80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
9f90: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
9fa0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
9fb0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
9fc0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
9fd0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
9fe0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
9ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
a000: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
a010: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
a020: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
a030: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
a040: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
a050: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
a060: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
a070: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
a080: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a090: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
a0a0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
a0b0: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
a0c0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
a0d0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
a0e0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
a0f0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
a100: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
a110: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
a120: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
a130: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
a140: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72  zPtr[50];.  char
a150: 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74   zCom[100];.  st
a160: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
a170: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
a180: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
a190: 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73  4d %-13s %.2X %s
a1a0: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
a1b0: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
a1c0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
a1d0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
a1e0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
a1f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a200: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
a210: 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43  MENTS.  displayC
a220: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
a230: 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43   zCom, sizeof(zC
a240: 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43  om));.#else.  zC
a250: 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69  om[0] = 0;.#endi
a260: 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20  f.  /* NB:  The 
a270: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
a280: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e() function is 
a290: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
a2a0: 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  ode created.  **
a2b0: 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   by the mkopcode
a2c0: 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f  h.awk and mkopco
a2d0: 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20  dec.awk scripts 
a2e0: 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68  which extract th
a2f0: 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  e.  ** informati
a300: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65  on from the vdbe
a310: 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a  .c source text *
a320: 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  /.  fprintf(pOut
a330: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
a340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
a350: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
a360: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
a370: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
a380: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
a390: 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a        zCom.  );.
a3a0: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
a3b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
a3c0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
a3d0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
a3e0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
a3f0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
a400: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
a410: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
a420: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
a430: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
a440: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
a450: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
a460: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
a470: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
a480: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
a490: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  eed ){.      do{
a4a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a4b0: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
a4c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
a4d0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
a4e0: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45  }while( (++p)<pE
a4f0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nd );.      retu
a500: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rn;.    }.    do
a510: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a520: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
a530: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
a540: 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b );.      asser
a550: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
a560: 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
a570: 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  (p) );..      /*
a580: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
a590: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
a5a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
a5b0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
a5c0: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
a5d0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
a5e0: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
a5f0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
a600: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
a610: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
a620: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
a630: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
a640: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
a650: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
a660: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
a670: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
a680: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
a690: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
a6a0: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
a6b0: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
a6c0: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
a6d0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
a6e0: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
a6f0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
a700: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
a710: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
a720: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
a730: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
a740: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
a750: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
a760: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
a770: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
a780: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
a790: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
a7a0: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
a7b0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
a7c0: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
a7d0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
a7e0: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
a7f0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
a800: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
a810: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
a820: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
a830: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
a840: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
a850: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a860: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41  p->flags & MEM_A
a870: 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gg );.      test
a880: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
a890: 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20   MEM_Dyn );.    
a8a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
a8b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65  lags & MEM_Frame
a8c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a8d0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a8e0: 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20  EM_RowSet );.   
a8f0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26     if( p->flags&
a900: 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e  (MEM_Agg|MEM_Dyn
a910: 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52  |MEM_Frame|MEM_R
a920: 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  owSet) ){.      
a930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a940: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
a950: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
a960: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
a970: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a980: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
a990: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d  ;.        p->szM
a9a0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
a9b0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
a9c0: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
a9d0: 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ed;.    }while( 
a9e0: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20  (++p)<pEnd );.  
a9f0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
aa00: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
aa10: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
aa20: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
aa30: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
aa40: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
aa50: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
aa60: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
aa70: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
aa80: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
aa90: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
aaa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
aab0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
aac0: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
aad0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
aae0: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
aaf0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
ab00: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
ab10: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
ab20: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
ab30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ab40: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
ab50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab60: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
ab70: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
ab80: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ab90: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
aba0: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
abb0: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
abc0: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
abd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
abe0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
abf0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
ac00: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
ac10: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
ac20: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
ac30: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
ac40: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
ac50: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
ac60: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
ac70: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
ac80: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
ac90: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
aca0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
acb0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
acc0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
acd0: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
ace0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
acf0: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
ad00: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
ad10: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
ad20: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
ad30: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
ad40: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
ad50: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
ad60: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
ad70: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
ad80: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
ad90: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
ada0: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
adb0: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
adc0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
add0: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
ade0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
adf0: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
ae00: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
ae10: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
ae20: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
ae30: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
ae40: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
ae50: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae70: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
ae80: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
aeb0: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
aec0: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
aed0: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
af00: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
af10: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
af20: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
af30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
af40: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
af50: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
af60: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
af90: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
afa0: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
afb0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
afe0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
aff0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b020: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
b030: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b050: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
b060: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
b070: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
b080: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b090: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
b0a0: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
b0b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
b0c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
b0d0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
b0e0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
b0f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
b100: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
b110: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
b120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
b130: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
b140: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
b150: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
b160: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
b170: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
b180: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
b190: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
b1a0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
b1b0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
b1c0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
b1d0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
b1e0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
b1f0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
b200: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
b210: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
b220: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
b230: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
b240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
b250: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
b260: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
b270: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
b280: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
b290: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
b2a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
b2b0: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
b2c0: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
b2d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
b2e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b2f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
b300: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
b310: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
b320: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
b330: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
b340: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
b350: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
b360: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
b370: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
b380: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
b390: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
b3a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b3b0: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
b3c0: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
b3d0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
b3e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b3f0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
b400: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
b410: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
b420: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
b430: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
b440: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
b450: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
b460: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
b470: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
b480: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
b490: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
b4a0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
b4b0: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
b4c0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
b4d0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
b4e0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
b4f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
b500: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
b510: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
b520: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
b530: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
b540: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
b550: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
b560: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
b570: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
b580: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
b590: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
b5a0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
b5b0: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
b5c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
b5d0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
b5e0: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
b5f0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
b600: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
b610: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
b620: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
b630: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
b640: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
b650: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
b660: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
b670: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
b680: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
b690: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
b6a0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
b6b0: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
b6c0: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
b6d0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
b6e0: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
b6f0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
b700: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
b710: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
b720: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
b730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
b740: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
b750: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
b760: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
b770: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
b780: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
b790: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
b7a0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
b7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b7c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
b7d0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
b7e0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
b7f0: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
b800: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
b810: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
b820: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
b830: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
b840: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
b850: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
b860: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
b870: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
b880: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
b890: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
b8a0: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
b8b0: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
b8c0: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
b8d0: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
b8e0: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
b8f0: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
b900: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
b910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b920: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
b930: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
b940: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
b950: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
b960: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
b970: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
b980: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
b990: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
b9a0: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
b9b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
b9c0: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
b9d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
b9e0: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
b9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba00: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
ba10: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
ba20: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
ba30: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
ba40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ba50: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
ba60: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
ba90: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
baa0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
bab0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
bac0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
bad0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
bae0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
baf0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
bb00: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
bb10: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
bb20: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
bb30: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
bb40: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
bb50: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
bb60: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
bb70: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
bb80: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
bb90: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
bba0: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
bbb0: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
bbc0: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
bbd0: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
bbe0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
bbf0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
bc00: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
bc10: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
bc20: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
bc30: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
bc40: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
bc50: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
bc60: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
bc70: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
bc80: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
bc90: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
bca0: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
bcb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
bcc0: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
bcd0: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
bce0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
bcf0: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
bd00: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
bd10: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
bd20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
bd30: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
bd40: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
bd50: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
bd60: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
bd70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
bd80: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
bd90: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
bda0: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
bdb0: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
bdc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
bdd0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
bde0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
bdf0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
be00: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
be10: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
be20: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
be30: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
be40: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
be50: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
be60: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
be70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
be80: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
be90: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
bea0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
beb0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
bee0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
bef0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
bf00: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
bf10: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
bf40: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
bf50: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
bf60: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
bf70: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
bfa0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
bfb0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
bfc0: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
bfd0: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
bfe0: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
bff0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
c000: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c020: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c030: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c040: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c050: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
c060: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
c070: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
c080: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  oc);.    if( zP4
c090: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
c0a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
c0b0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
c0c0: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
c0d0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
c0e0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
c0f0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
c100: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
c110: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
c120: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
c130: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c140: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
c150: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
c160: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
c170: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
c180: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
c190: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
c1a0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   4) ){.        a
c1b0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
c1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c1d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c1e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
c1f0: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
c200: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
c210: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c220: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
c230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c240: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
c250: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
c260: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
c270: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c280: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
c290: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
c2a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c2b0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
c2c0: 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  S.      if( sqli
c2d0: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
c2e0: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35  ndResize(pMem, 5
c2f0: 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  00) ){.        a
c300: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
c310: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c330: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
c340: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
c350: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
c360: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c370: 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79  Mem->n = display
c380: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
c390: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b  , pMem->z, 500);
c3a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
c3b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
c3c0: 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d  #else.      pMem
c3d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
c3e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
c3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
c400: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
c410: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65     }..    p->nRe
c420: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a  sColumn = 8 - 4*
c430: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
c440: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65      p->pResultSe
c450: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
c460: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c470: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
c480: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
c490: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c4a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c4b0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
c4c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c4d0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
c4e0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
c4f0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
c500: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
c510: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
c520: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
c530: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
c540: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
c550: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
c560: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
c570: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
c580: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
c590: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
c5a0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
c5b0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
c5c0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
c5d0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
c5e0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
c5f0: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
c600: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
c610: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
c620: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
c630: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
c640: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
c650: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
c660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
c670: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
c680: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
c690: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
c6a0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
c6b0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
c6c0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
c6d0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
c6e0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
c6f0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
c700: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
c710: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
c720: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
c730: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
c740: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
c750: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
c760: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
c770: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
c780: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
c790: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
c7a0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
c7b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c7c0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
c7d0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
c7e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
c7f0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
c800: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
c810: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
c820: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c830: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
c840: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
c850: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
c860: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
c870: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
c880: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
c890: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
c8a0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
c8b0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
c8c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
c8d0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
c8e0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
c8f0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
c900: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
c910: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
c920: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
c930: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
c940: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
c950: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
c960: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
c970: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
c980: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
c990: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
c9a0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
c9b0: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
c9c0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
c9d0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
c9e0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
c9f0: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
ca00: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
ca10: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
ca20: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
ca30: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
ca40: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
ca50: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
ca60: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
ca70: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
ca80: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
ca90: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
caa0: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
cab0: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
cac0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
cad0: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
cae0: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
caf0: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
cb00: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
cb10: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
cb20: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
cb30: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
cb40: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
cb50: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
cb60: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
cb70: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
cb80: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
cb90: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
cba0: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
cbb0: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
cbc0: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
cbd0: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
cbe0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
cbf0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
cc00: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
cc10: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
cc20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
cc30: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
cc40: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
cc50: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
cc60: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
cc70: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
cc80: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
cc90: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
cca0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
ccb0: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
ccc0: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
ccd0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
cce0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
ccf0: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
cd10: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
cd20: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
cd30: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
cd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cd50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
cd60: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
cd70: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
cd80: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
cd90: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
cda0: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
cdb0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
cdc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
cdd0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
cde0: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
cdf0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
ce00: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
ce10: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
ce20: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
ce30: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
ce40: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
ce50: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
ce60: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
ce70: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
ce80: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
ce90: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
cea0: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
ceb0: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
cec0: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
ced0: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
cee0: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
cef0: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
cf00: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
cf10: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
cf20: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
cf30: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
cf40: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
cf50: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
cf60: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
cf70: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
cf80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
cf90: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
cfa0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
cfb0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
cfc0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
cfd0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
cfe0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
cff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d000: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
d010: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
d020: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
d030: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
d040: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
d050: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
d060: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
d070: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
d080: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
d090: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
d0a0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
d0b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
d0c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d0d0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
d0e0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
d0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d100: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
d110: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
d120: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
d130: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d140: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
d150: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
d160: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d170: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
d180: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
d190: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
d1a0: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
d1b0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
d1c0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
d1d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
d1e0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
d1f0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
d200: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
d210: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d220: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
d230: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
d240: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
d250: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d260: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
d270: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
d280: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
d290: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
d2a0: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
d2b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d2c0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
d2d0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
d2e0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
d2f0: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
d300: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
d310: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
d320: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
d330: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
d340: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
d350: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
d360: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
d370: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d380: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
d390: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
d3a0: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
d3b0: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
d3c0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
d3d0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d3e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
d3f0: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
d400: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
d410: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
d420: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d430: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
d440: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
d450: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
d460: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
d470: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
d480: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
d490: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
d4a0: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
d4b0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
d4c0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
d4d0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
d4e0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
d4f0: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
d500: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
d510: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
d520: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
d530: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
d540: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
d550: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
d560: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
d570: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
d580: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
d590: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
d5a0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
d5b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d5c0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
d5d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d600: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d630: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
d640: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
d650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d660: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d670: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
d680: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
d690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d6a0: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
d6b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d6e0: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
d6f0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
d700: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
d710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d720: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
d730: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
d740: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d760: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d770: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
d780: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
d790: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d7a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d7b0: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
d7c0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
d7d0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d800: 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20    u8 *zCsr;     
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   /* Memory avail
d830: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
d840: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e  ion */.  u8 *zEn
d850: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
d860: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d870: 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63   byte past alloc
d880: 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ated memory */. 
d890: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72  /* How much extr
d8c0: 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64  a memory is need
d8d0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
d8e0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
d8f0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
d900: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
d910: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d920: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
d930: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
d940: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
d950: 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
d960: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
d970: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
d980: 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
d990: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
d9a0: 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
d9b0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
d9c0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
d9d0: 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
d9e0: 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e  se->nMaxArg;.  n
d9f0: 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Once = pParse->n
da00: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63  Once;.  if( nOnc
da10: 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31  e==0 ) nOnce = 1
da20: 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c  ; /* Ensure at l
da30: 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e  east one byte in
da40: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20   p->aOnceFlag[] 
da50: 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65  */.  .  /* For e
da60: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
da70: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
da80: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
da90: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
daa0: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
dab0: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
dac0: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
dad0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
dae0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
daf0: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
db00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
db10: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
db20: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
db30: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
db40: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
db50: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
db60: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
db70: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
db80: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
db90: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
dba0: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
dbb0: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
dbc0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
dbd0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
dbe0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
dbf0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
dc00: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
dc10: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
dc20: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
dc30: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
dc40: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
dc50: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
dc60: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
dc70: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
dc80: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
dc90: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
dca0: 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43  ts in..  */.  zC
dcb0: 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  sr = (u8*)&p->aO
dcc0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
dcd0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
dce0: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
dcf0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
dd00: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
dd10: 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  p[pParse->nOpAll
dd20: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
dd30: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
dd40: 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73  zCsr[] */..  res
dd50: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
dd60: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
dd70: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
dd80: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
dd90: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
dda0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
ddb0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
ddc0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
ddd0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
dde0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
ddf0: 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73  Csr, 0, zEnd-zCs
de00: 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a  r);.  zCsr += (z
de10: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
de20: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
de30: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
de40: 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78  zCsr) );.  p->ex
de50: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
de60: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
de70: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
de80: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
de90: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
dea0: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
deb0: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
dec0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
ded0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
dee0: 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  e at the .  ** e
def0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
df00: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
df10: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
df20: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
df30: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
df40: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
df50: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
df60: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
df70: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
df80: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
df90: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
dfa0: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
dfb0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
dfc0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
dfd0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
dfe0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
dff0: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
e000: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
e010: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
e020: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
e030: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
e040: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
e050: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
e060: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
e070: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e080: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
e090: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  .    nByte = 0;.
e0a0: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
e0b0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
e0c0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
e0d0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
e0e0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
e0f0: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
e100: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
e110: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
e120: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
e130: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67  e);.    p->apArg
e140: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
e150: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
e160: 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72  eof(Mem*), &zCsr
e170: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
e180: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
e190: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a  allocSpace(p->az
e1a0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
e1b0: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20  (char*), &zCsr, 
e1c0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
e1d0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
e1e0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
e1f0: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
e200: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
e230: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
e240: 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
e250: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
e260: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
e270: 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  e, &zCsr, zEnd, 
e280: 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 66 20  &nByte);.#ifdef 
e290: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e2a0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
e2b0: 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c    p->anExec = al
e2c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78  locSpace(p->anEx
e2d0: 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
e2e0: 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a  f(i64), &zCsr, z
e2f0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65  End, &nByte);.#e
e300: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 42 79  ndif.    if( nBy
e310: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  te ){.      p->p
e320: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
e330: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
e340: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
e350: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
e360: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43  ;.    zEnd = &zC
e370: 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68  sr[nByte];.  }wh
e380: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
e390: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e3a0: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
e3b0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
e3c0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
e3d0: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
e3e0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
e3f0: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
e400: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
e410: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
e420: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
e430: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
e440: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
e450: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
e460: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
e470: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   && pParse->nzVa
e480: 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a  r>0 ){.    p->nz
e490: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a  Var = pParse->nz
e4a0: 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Var;.    memcpy(
e4b0: 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65  p->azVar, pParse
e4c0: 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61  ->azVar, p->nzVa
e4d0: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61  r*sizeof(p->azVa
e4e0: 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73  r[0]));.    mems
e4f0: 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  et(pParse->azVar
e500: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56  , 0, pParse->nzV
e510: 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  ar*sizeof(pParse
e520: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
e530: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
e540: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  ){.    p->aMem--
e550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e560: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
e570: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
e580: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65  em */.    p->nMe
e590: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
e5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
e5b0: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
e5c0: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72  Mem-1 */.    for
e5d0: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
e5e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
e5f0: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
e600: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
e610: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
e620: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
e630: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
e640: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
e650: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e660: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
e670: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
e680: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
e690: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
e6a0: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
e6b0: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
e6c0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
e6d0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
e6e0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
e6f0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
e700: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
e710: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e720: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
e730: 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
e740: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
e750: 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
e760: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
e770: 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
e780: 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
e790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
e7a0: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
e7b0: 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
e7c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e7d0: 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
e7e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
e7f0: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  x->pBt ){.      
e800: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e810: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
e820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
e830: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
e840: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
e850: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
e860: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
e870: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
e880: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
e890: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e8a0: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
e8b0: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
e8c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e8d0: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
e8e0: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
e8f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e900: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e920: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
e930: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
e940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
e950: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
e960: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
e970: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
e980: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
e990: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
e9a0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
e9b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
e9c0: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
e9d0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
e9e0: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
e9f0: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
ea00: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
ea10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ea20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
ea30: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
ea40: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
ea50: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
ea60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
ea70: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
ea80: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
ea90: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
eaa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
eab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
eac0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
ead0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
eae0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
eaf0: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
eb00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eb10: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
eb20: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
eb30: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
eb40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
eb50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
eb60: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
eb70: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
eb80: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
eb90: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
eba0: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
ebb0: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
ebc0: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
ebd0: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
ebe0: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
ebf0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
ec00: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
ec10: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
ec20: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
ec30: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
ec40: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
ec50: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
ec60: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
ec70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ec80: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
ec90: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
eca0: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
ecb0: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
ecc0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
ecd0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
ece0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ecf0: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
ed00: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
ed10: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
ed20: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
ed30: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
ed40: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
ed50: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
ed60: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
ed70: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
ed80: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
ed90: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
eda0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
edb0: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
edc0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
edd0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
ede0: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
edf0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
ee00: 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  bChange;.  retur
ee10: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
ee20: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
ee30: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
ee40: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
ee50: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
ee60: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
ee70: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
ee80: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
ee90: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
eea0: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
eeb0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
eec0: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
eed0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
eee0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
eef0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
ef00: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
ef10: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
ef20: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
ef30: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
ef40: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
ef50: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
ef60: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
ef70: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
ef80: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
ef90: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
efa0: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
efb0: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
efc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
efd0: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
efe0: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
eff0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
f000: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
f010: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
f020: 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75  ==0 );.  closeCu
f030: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b  rsorsInFrame(p);
f040: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
f050: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
f060: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
f070: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
f080: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
f090: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
f0a0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
f0b0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
f0c0: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
f0d0: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
f0e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f0f0: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
f100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
f110: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
f120: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
f130: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f140: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f150: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f160: 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c  teAuxData(p, -1,
f170: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
f180: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
f190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
f1a0: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
f1b0: 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f  a single run..*/
f1c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
f1d0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
f1e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f1f0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
f200: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
f210: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
f220: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
f230: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
f240: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
f250: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
f260: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
f270: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
f280: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
f290: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
f2a0: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
f2b0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
f2c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
f2d0: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
f2e0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
f2f0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
f300: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f310: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f320: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f330: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f340: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f350: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f360: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f370: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f380: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f390: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f3a0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f3b0: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f3c0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f3d0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f3e0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f3f0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f400: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f410: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f420: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f430: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
f440: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
f450: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
f460: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
f470: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
f480: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
f490: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
f4a0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f4b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
f4c0: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
f4d0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
f4e0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
f4f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
f500: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f510: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
f520: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f530: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
f540: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
f550: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
f560: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
f570: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
f580: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
f590: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
f5a0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
f5b0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
f5c0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f5d0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
f5e0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
f5f0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
f600: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
f610: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
f620: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
f630: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
f640: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
f650: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
f660: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
f670: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
f680: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
f690: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f6a0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
f6b0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
f6c0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
f6d0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
f6e0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
f6f0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
f700: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
f710: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
f720: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
f730: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
f740: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
f750: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
f760: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
f770: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
f780: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
f790: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
f7a0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
f7b0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
f7c0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
f7d0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
f7e0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
f7f0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
f800: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
f810: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f820: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
f830: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
f860: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
f870: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
f8a0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
f8b0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
f8c0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f8e0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
f8f0: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
f900: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f910: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
f920: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f930: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
f940: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
f950: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
f960: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
f970: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
f980: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
f990: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
f9a0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
f9b0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
f9c0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
f9d0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
f9e0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
f9f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
fa00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fa10: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
fa20: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
fa30: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
fa40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fa50: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
fa60: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
fa70: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
fa80: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
fa90: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
faa0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
fab0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fac0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
fad0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
fae0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
faf0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
fb00: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
fb10: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
fb20: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
fb30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fb40: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
fb50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
fb60: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
fb70: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
fb80: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
fb90: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
fba0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
fbb0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
fbc0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
fbd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
fbe0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
fbf0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
fc00: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
fc10: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
fc20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fc30: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
fc40: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
fc50: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
fc60: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
fc70: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
fc80: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
fc90: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
fca0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
fcb0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
fcc0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
fcd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fce0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
fcf0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fd00: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fd10: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
fd20: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
fd30: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
fd40: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
fd50: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
fd60: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
fd70: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
fd80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
fd90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
fda0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
fdb0: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
fdc0: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
fdd0: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
fde0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
fdf0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
fe00: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
fe10: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
fe20: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
fe30: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
fe40: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
fe50: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
fe60: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
fe70: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
fe80: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
fe90: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
fea0: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
feb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
fec0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
fed0: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
fee0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
fef0: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
ff00: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
ff10: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
ff20: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
ff30: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
ff40: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
ff50: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
ff60: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
ff70: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
ff80: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
ff90: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
ffa0: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
ffb0: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
ffc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
ffd0: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
ffe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
fff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
10000 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
10010 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
10020 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
10030 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
10040 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10050 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10060 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10070 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10080 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10090 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
100a0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
100b0 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
100c0 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
100d0 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  rans++;.      sq
100e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
100f0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
10100 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
10110 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
10120 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
10130 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10140 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
10150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10170 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10180 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10190 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
101a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
101b0 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
101c0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
101d0 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
101e0 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
101f0 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
10200 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
10210 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
10220 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
10230 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10250 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
10260 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
10270 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
10280 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
10290 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
102a0 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
102b0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
102c0 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
102d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
102e0 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
102f0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
10300 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
10310 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
10320 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
10330 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
10340 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
10350 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
10360 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
10370 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
10380 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
10390 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
103a0 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
103b0 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
103c0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
103d0 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
103e0 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
103f0 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
10400 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
10410 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
10420 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
10430 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
10440 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
10450 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
10460 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
10470 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10480 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10490 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
104a0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
104b0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
104c0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
104d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
104e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
104f0 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
10500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10510 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
10520 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
10530 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
10540 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
10550 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
10560 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
10570 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
10580 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
10590 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
105a0 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
105b0 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
105c0 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
105d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
105e0 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
105f0 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
10600 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
10610 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
10620 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
10630 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
10640 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
10650 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10660 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
10670 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10680 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10690 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
106a0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
106b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
106c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
106d0 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
106e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
106f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
10710 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
10720 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
10730 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
10740 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
10750 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
10760 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
10770 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
10780 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
10790 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
107a0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
107b0 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
107c0 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
107d0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
107e0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
107f0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
10800 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
10810 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
10820 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
10830 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
10840 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
10850 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
10860 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
10870 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
10880 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
10890 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
108a0 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
108b0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
108c0 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
108d0 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
108e0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
108f0 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
10900 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
10910 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
10920 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
10930 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10940 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
10950 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
10960 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
10970 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
10980 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10990 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
109a0 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
109b0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
109c0 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
109d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
109e0 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  EM;.    do {.   
109f0 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
10a00 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
10a10 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
10a20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
10a30 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
10a40 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
10a50 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
10a60 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
10a70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10a80 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10a90 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10aa0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10ab0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10ac0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
10ad0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
10ae0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
10af0 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
10b00 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
10b10 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
10b20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
10b30 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
10b40 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
10b50 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
10b60 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
10b70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
10b80 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
10b90 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
10ba0 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10bd0 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
10be0 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
10bf0 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
10c00 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
10c10 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10c20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10c30 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
10c40 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
10c50 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
10c60 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
10c70 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
10c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
10c90 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
10ca0 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
10cb0 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
10cc0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
10cd0 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
10ce0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
10cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10d00 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
10d10 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
10d20 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
10d30 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
10d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
10d50 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d70 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
10d80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
10d90 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
10da0 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
10db0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10dc0 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
10dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10de0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
10df0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
10e00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10e10 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
10e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
10e30 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
10e40 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
10e50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10e60 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10e70 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10e80 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
10e90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
10ea0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
10eb0 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
10ec0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
10ed0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
10ee0 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
10ef0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
10f00 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
10f10 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
10f20 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
10f30 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
10f40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10f50 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
10f60 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
10f70 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
10f80 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
10f90 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
10fa0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
10fb0 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
10fc0 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
10fd0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
10fe0 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
10ff0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
11000 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11010 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11020 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11030 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11040 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
11050 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
11060 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
11070 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
11080 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
11090 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
110a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
110b0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
110c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
110d0 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
110e0 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
110f0 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
11100 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11110 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
11120 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
11130 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
11140 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11150 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
11160 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
11170 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
11180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11190 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
111a0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
111b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
111c0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
111d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
111e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
111f0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
11200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11210 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
11220 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
11230 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11240 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11250 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11260 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
11270 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11280 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11290 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
112a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
112b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
112c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
112d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
112e0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
112f0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
11300 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
11310 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
11320 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
11330 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
11340 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
11350 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11360 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
11370 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
11380 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
11390 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
113a0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
113b0 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
113c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
113d0 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
113e0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
113f0 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11400 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11410 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
11420 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
11430 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11440 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11460 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
11470 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
11480 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
11490 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
114a0 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
114b0 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
114c0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
114d0 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
114e0 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
114f0 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
11500 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
11510 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
11520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11530 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
11540 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
11550 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
11560 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
11570 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
11580 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11590 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
115a0 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
115b0 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
115c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
115d0 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
115e0 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
115f0 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
11600 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
11610 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11620 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
11630 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
11640 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
11650 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
11660 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
11670 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11690 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
116a0 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
116b0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
116c0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
116d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
116e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
116f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
11700 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
11710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11720 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11730 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11740 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
11750 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
11760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11770 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11780 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11790 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
117a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
117b0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
117c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
117d0 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
117e0 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
117f0 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
11800 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
11810 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
11820 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
11830 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
11840 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
11850 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
11860 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
11870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
11880 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11890 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a  ter, needSync);.
118a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
118b0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
118c0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
118d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
118e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
118f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
11900 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
11910 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
11920 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
11930 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
11940 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
11950 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
11960 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
11970 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
11980 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
11990 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
119a0 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
119b0 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
119c0 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
119d0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
119e0 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
119f0 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
11a00 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
11a10 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
11a20 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
11a30 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
11a40 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
11a50 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
11a60 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
11a70 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
11a80 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
11a90 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
11aa0 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
11ab0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11ac0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11ad0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11ae0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11af0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11b00 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11b10 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11b20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11b30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
11b40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11b50 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11b60 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
11b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11b80 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11b90 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
11ba0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11bb0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
11bc0 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
11bd0 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
11be0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
11bf0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
11c00 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11c10 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
11c20 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
11c30 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
11c40 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
11c50 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
11c60 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
11c70 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
11c80 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
11c90 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
11ca0 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
11cb0 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
11cc0 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
11cd0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
11ce0 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
11cf0 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
11d00 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
11d10 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
11d20 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
11d30 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
11d40 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
11d50 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
11d60 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
11d70 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
11d80 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
11d90 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
11da0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
11db0 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
11dc0 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
11dd0 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
11de0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11df0 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
11e00 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
11e10 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
11e20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
11e30 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
11e40 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
11e50 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
11e60 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
11e70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
11e80 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
11e90 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
11ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
11eb0 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
11ec0 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
11ed0 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
11ee0 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
11ef0 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
11f00 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
11f10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
11f20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
11f30 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
11f40 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
11f50 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
11f60 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
11f70 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
11f80 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
11f90 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
11fa0 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
11fb0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
11fc0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
11fd0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
11fe0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
11ff0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12000 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
12010 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
12020 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
12030 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
12040 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12050 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
12060 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
12070 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12080 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12090 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
120a0 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
120b0 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
120c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
120d0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
120e0 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
120f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12100 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12110 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12120 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
12130 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
12140 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
12150 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
12160 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
12170 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12180 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
12190 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
121a0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
121b0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
121c0 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
121d0 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
121e0 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
121f0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
12200 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
12210 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
12220 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
12230 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
12240 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
12250 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
12260 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
12270 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12280 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12290 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
122a0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
122b0 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
122c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
122d0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
122e0 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
122f0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
12300 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
12310 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
12320 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
12330 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
12340 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
12350 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12360 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
12370 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
12380 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
12390 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
123a0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
123b0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
123c0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
123d0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
123e0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
123f0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
12400 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
12410 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
12420 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
12430 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12440 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
12450 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
12460 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
12470 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12480 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12490 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
124a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
124b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
124c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
124d0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
124e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
124f0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
12500 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
12510 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
12520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12540 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12550 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12570 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12580 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12590 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
125a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
125b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
125c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
125d0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
125e0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
125f0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
12600 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12610 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
12620 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
12630 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12640 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
12650 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
12660 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
12670 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
12680 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
12690 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
126a0 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
126b0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
126c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
126d0 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
126e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
126f0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12700 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
12710 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
12720 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
12730 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
12740 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
12750 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
12760 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
12770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12780 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12790 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
127a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
127b0 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
127c0 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
127d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
127e0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
127f0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
12800 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
12810 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
12820 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
12830 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
12840 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
12850 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
12860 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
12870 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
12880 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
12890 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
128a0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
128b0 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
128c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
128d0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
128e0 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
128f0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
12900 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
12910 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
12920 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
12930 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
12940 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
12950 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
12960 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12970 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
12980 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
12990 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
129a0 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
129b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
129c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
129d0 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
129e0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
129f0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12a00 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
12a10 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
12a20 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
12a30 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
12a40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
12a50 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
12a60 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
12a70 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
12a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
12a90 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
12aa0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
12ab0 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
12ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12ad0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12af0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12b00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12b10 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
12b20 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
12b30 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
12b40 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
12b50 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
12b60 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
12b70 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
12b80 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
12b90 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
12ba0 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
12bb0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12bd0 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
12be0 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
12bf0 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
12c00 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
12c10 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
12c20 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
12c30 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
12c40 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
12c50 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
12c60 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
12c70 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
12c80 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
12c90 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
12ca0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
12cb0 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
12cc0 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
12cd0 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
12ce0 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
12cf0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
12d00 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
12d10 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
12d20 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
12d30 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
12d40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12d50 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
12d60 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
12d90 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
12da0 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
12db0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12dc0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
12dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
12de0 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
12df0 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
12e00 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
12e10 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
12e20 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
12e30 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12e40 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
12e50 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
12e60 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
12e70 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
12e80 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
12e90 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12ea0 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
12eb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
12ec0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
12ed0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
12ee0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
12ef0 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
12f00 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
12f10 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
12f20 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
12f30 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
12f40 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
12f50 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
12f60 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
12f70 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
12f80 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12f90 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
12fa0 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
12fb0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
12fc0 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
12fd0 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
12fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12ff0 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
13000 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13010 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13020 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
13030 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
13040 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
13050 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
13060 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
13070 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
13080 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
13090 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
130a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
130b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
130c0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
130d0 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
130e0 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
130f0 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
13100 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
13110 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65  tarted or if the
13120 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
13130 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  ent does not rea
13140 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74  d or write a dat
13150 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  abase file.  */.
13160 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26    if( p->pc>=0 &
13170 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  & p->bIsReader )
13180 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
13190 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
131a0 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
131b0 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
131c0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
131d0 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
131e0 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
131f0 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
13200 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
13210 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
13220 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
13230 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
13240 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
13250 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
13260 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
13270 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
13280 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
13290 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
132a0 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
132b0 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
132c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
132d0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
132e0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
132f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
13300 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
13310 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
13320 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
13330 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
13340 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
13350 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
13360 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
13370 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
13380 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
13390 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
133a0 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
133b0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
133c0 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
133d0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
133e0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
133f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
13400 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
13410 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
13420 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
13430 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
13440 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
13450 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
13460 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
13470 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
13480 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
13490 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
134a0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
134b0 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
134c0 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
134d0 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77     ** occurred w
134e0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
134f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
13500 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
13510 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
13520 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
13530 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
13540 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
13550 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
13560 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
13570 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
13580 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
13590 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
135a0 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
135b0 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
135c0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
135d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
135e0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
135f0 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
13600 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
13610 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
13620 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
13630 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
13640 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
13650 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
13660 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
13670 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
13680 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
13690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
136a0 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
136b0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
136c0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
136d0 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
136e0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
136f0 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
13700 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
13710 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
13720 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
13730 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
13740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13750 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13760 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
13770 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACK);.          
13780 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13790 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
137a0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
137b0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
137c0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
137d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
137e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
137f0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
13800 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
13810 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
13820 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
13830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13850 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
13860 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
13870 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
13880 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
13890 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
138a0 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
138b0 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
138c0 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
138d0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
138e0 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
138f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
13900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
13910 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
13920 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
13930 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
13940 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
13950 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
13960 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
13970 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
13980 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
13990 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
139a0 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
139b0 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
139c0 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
139d0 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
139e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
139f0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
13a00 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
13a10 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
13a20 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
13a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13a40 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
13a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13a70 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
13a80 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
13a90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
13aa0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
13ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
13ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13ad0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
13ae0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13af0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13b00 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
13b10 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
13b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
13b30 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
13b40 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
13b50 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
13b60 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
13b70 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
13b80 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
13b90 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
13ba0 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
13bb0 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
13bc0 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
13bd0 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
13be0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
13bf0 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
13c00 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
13c10 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
13c20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13c30 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
13c40 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
13c50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13c60 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
13c70 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13c90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13ca0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13cb0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
13cc0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
13cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13ce0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13d00 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13d10 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13d20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
13d30 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
13d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d50 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
13d60 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
13d70 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13d80 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
13d90 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
13da0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
13db0 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
13dc0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
13dd0 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
13de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e00 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13e10 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
13e20 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
13e30 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13e40 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
13e50 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
13e60 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
13e70 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
13e80 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13e90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
13ea0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
13eb0 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
13ec0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
13ed0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13ef0 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
13f00 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
13f10 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
13f20 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
13f30 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
13f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13f50 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13f60 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
13f70 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
13f80 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
13f90 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
13fa0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
13fb0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13fc0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13fd0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13fe0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
13ff0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
14000 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
14010 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
14020 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
14030 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
14040 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
14050 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
14060 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
14070 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
14080 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
14090 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
140a0 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
140b0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
140c0 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
140d0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
140e0 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
140f0 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
14100 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
14110 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
14120 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
14130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
14140 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
14150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14160 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
14170 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
14180 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
14190 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
141a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
141b0 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
141c0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
141d0 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
141e0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
141f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
14200 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
14210 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
14220 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
14230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14240 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14250 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14260 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
14270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14280 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
14290 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
142a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
142b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
142c0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
142d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
142e0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
142f0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
14300 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
14310 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
14320 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
14330 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
14340 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
14350 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14360 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
14370 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
14380 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
14390 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
143a0 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
143b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
143c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
143d0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
143e0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
143f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14410 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
14420 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14430 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14440 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
14450 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
14460 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
14470 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14480 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
14490 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
144a0 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
144b0 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
144c0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
144d0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
144e0 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
144f0 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
14500 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
14510 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
14520 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
14530 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
14540 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
14550 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
14560 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
14570 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
14580 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
14590 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
145a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
145b0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
145c0 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
145d0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
145e0 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
145f0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
14600 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
14610 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14620 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14630 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
14640 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14650 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14660 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
14670 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
14680 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
14690 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
146a0 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
146b0 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
146c0 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
146d0 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
146e0 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
146f0 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
14700 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
14710 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
14720 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
14730 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
14740 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
14750 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
14760 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
14770 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
14780 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
14790 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
147a0 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
147b0 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
147c0 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
147d0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
147e0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
147f0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
14800 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
14810 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
14820 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
14830 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
14840 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
14850 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
14860 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14870 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
14880 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
14890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
148a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
148b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
148c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
148d0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
148e0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
148f0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
14900 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
14910 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
14920 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
14930 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
14940 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
14950 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
14960 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14970 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
14980 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
14990 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
149a0 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
149b0 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
149c0 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
149d0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
149e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
149f0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
14a00 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
14a10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
14a20 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
14a30 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
14a40 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
14a50 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
14a60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
14a80 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14a90 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
14aa0 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
14ab0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14ac0 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
14ad0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
14ae0 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
14af0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
14b00 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
14b10 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
14b20 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14b30 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
14b40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
14b50 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
14b60 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
14b70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14b80 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14b90 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
14ba0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
14bb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
14bc0 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
14bd0 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
14be0 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
14bf0 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
14c00 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
14c10 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
14c20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14c30 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
14c40 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
14c50 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14c60 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
14c70 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
14c80 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
14c90 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
14ca0 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
14cb0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
14cc0 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
14cd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
14ce0 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
14cf0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
14d00 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
14d10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14d20 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
14d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
14d40 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
14d50 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
14d60 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
14d70 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14d80 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
14d90 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
14da0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
14db0 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
14dc0 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
14dd0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
14de0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
14df0 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
14e00 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
14e10 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
14e20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
14e30 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
14e40 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
14e50 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
14e60 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
14e70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
14e80 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
14e90 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
14ea0 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
14eb0 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
14ec0 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
14ed0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
14ee0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
14ef0 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
14f00 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
14f10 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
14f20 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
14f30 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
14f40 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
14f50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14f60 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
14f70 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14f80 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
14f90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
14fa0 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
14fb0 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
14fc0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
14fd0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
14fe0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
14ff0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
15000 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
15010 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
15020 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15030 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
15040 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
15050 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
15060 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
15070 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
15080 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
15090 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
150a0 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
150b0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
150c0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
150d0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
150e0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
150f0 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15100 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15110 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
15120 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
15130 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
15140 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
15150 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
15160 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
15170 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15180 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15190 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
151a0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
151b0 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
151c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
151d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
151e0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
151f0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15200 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15210 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
15220 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
15230 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
15240 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
15250 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
15260 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
15270 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15280 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15290 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
152a0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
152b0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
152c0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
152d0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
152e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
152f0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15310 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
15320 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
15330 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
15340 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
15350 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15360 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15370 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15380 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15390 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
153a0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
153b0 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
153c0 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
153d0 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
153e0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
153f0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
15400 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
15410 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
15420 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
15430 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
15440 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
15450 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
15460 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
15470 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
15480 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15490 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
154a0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
154b0 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
154c0 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
154d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
154f0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
15500 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
15510 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
15520 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
15530 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15540 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
15550 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
15560 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
15570 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
15580 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15590 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
155a0 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
155b0 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
155c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
155d0 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
155e0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
155f0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
15600 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15610 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
15620 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
15630 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
15640 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15650 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
15660 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
15670 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15680 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
156a0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
156b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
156c0 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
156d0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
156e0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
156f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15700 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15710 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
15720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
15730 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
15740 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
15750 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
15760 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
15770 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15780 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15790 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
157a0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
157b0 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
157c0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
157d0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
157e0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
157f0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
15800 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
15810 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
15820 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
15830 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
15840 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
15850 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
15860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15870 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
15880 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
158a0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
158b0 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
158c0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
158d0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
158e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
158f0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
15900 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
15910 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
15920 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15930 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
15940 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15950 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
15960 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
15970 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
15980 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
15990 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
159a0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
159b0 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
159c0 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
159d0 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
159e0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
159f0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
15a00 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15a10 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
15a20 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
15a30 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
15a40 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
15a50 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
15a60 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
15a70 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
15a80 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
15a90 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
15aa0 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
15ab0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
15ac0 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
15ad0 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
15ae0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
15af0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
15b00 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
15b10 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
15b20 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
15b30 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
15b40 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
15b50 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
15b60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
15b70 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
15b80 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
15b90 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
15ba0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
15bb0 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
15bc0 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
15bd0 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
15be0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
15bf0 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65  Data(Vdbe *pVdbe
15c00 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
15c10 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20  ask){.  AuxData 
15c20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70  **pp = &pVdbe->p
15c30 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65  AuxData;.  while
15c40 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
15c50 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
15c60 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
15c70 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
15c80 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
15c90 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
15ca0 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
15cb0 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
15cc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15cd0 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
15ce0 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
15cf0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
15d00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
15d10 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
15d20 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
15d30 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
15d40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
15d50 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64  qlite3DbFree(pVd
15d60 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20  be->db, pAux);. 
15d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15d80 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
15d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15da0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
15db0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
15dc0 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
15dd0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15de0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
15df0 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
15e00 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
15e10 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
15e20 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
15e30 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
15e40 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
15e50 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
15e60 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
15e70 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
15e80 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
15e90 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
15ea0 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
15eb0 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
15ec0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
15ed0 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
15ee0 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
15ef0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
15f00 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
15f10 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
15f20 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
15f30 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
15f40 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
15f50 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
15f60 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
15f70 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
15f80 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
15f90 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
15fa0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
15fb0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
15fc0 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
15fd0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
15fe0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
15ff0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
16000 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
16010 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16020 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
16030 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
16040 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16050 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
16060 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
16070 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
16080 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16090 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62  azVar[i]);.  vdb
160a0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
160b0 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
160c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
160d0 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
160e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
160f0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
16100 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16110 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
16120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16130 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
16140 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b  TATUS.  for(i=0;
16150 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b   i<p->nScan; i++
16160 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
16170 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16180 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  n[i].zName);.  }
16190 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
161a0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
161b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
161c0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
161d0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
161e0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
161f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
16200 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
16210 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
16220 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
16230 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
16240 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16250 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
16260 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
16270 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
16280 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
16290 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
162a0 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
162b0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
162c0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
162d0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
162e0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
162f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16300 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
16310 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
16320 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
16330 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
16340 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
16350 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
16360 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
16370 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
16380 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
16390 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
163a0 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
163b0 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
163c0 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
163d0 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
163e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
163f0 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
16400 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
16410 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
16420 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16430 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
16440 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
16450 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16460 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
16470 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16480 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
16490 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
164a0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
164b0 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
164c0 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
164d0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
164e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
164f0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16500 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
16510 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
16520 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
16530 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
16540 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
16550 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
16560 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16570 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
16580 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16590 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
165a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
165b0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
165c0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
165d0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
165e0 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
165f0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16600 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
16610 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16620 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
16630 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
16640 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
16650 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
16660 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
16670 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
16680 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
16690 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
166a0 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
166b0 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
166c0 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
166d0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
166e0 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
166f0 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
16700 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
16710 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
16720 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
16730 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
16740 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
16750 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
16760 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
16770 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16780 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16790 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
167a0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
167b0 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
167c0 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
167d0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
167e0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
167f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
16800 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
16810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
16820 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
16830 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
16840 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
16850 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
16860 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
16870 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
16880 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
16890 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
168a0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
168b0 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
168c0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
168d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
168e0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
168f0 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
16900 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
16910 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
16920 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
16930 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
16940 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
16950 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
16960 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
16970 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
16980 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
16990 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
169a0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
169b0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
169c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
169d0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
169e0 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
169f0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
16a00 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
16a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16a20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16a30 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
16a40 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
16a50 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
16a60 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
16a70 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
16a80 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
16a90 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
16aa0 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
16ab0 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
16ac0 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
16ad0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
16ae0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
16af0 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
16b00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
16b10 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
16b20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
16b30 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
16b40 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
16b50 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
16b60 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
16b70 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
16b80 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
16b90 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
16ba0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16bb0 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
16bc0 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
16bd0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
16be0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
16bf0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
16c00 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
16c10 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
16c20 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
16c30 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
16c40 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16c50 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
16c60 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
16c70 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16c90 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
16ca0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16cb0 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79 70    if( p->eCurTyp
16cc0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
16cd0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64   ){.    if( p->d
16ce0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
16cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
16d00 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
16d10 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  to(p);.    }.   
16d20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
16d30 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16d40 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
16d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  {.      return h
16d60 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
16d70 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
16d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16d90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
16da0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
16db0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
16dc0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16dd0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
16de0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
16df0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
16e00 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
16e10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
16e20 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
16e30 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
16e40 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
16e50 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
16e60 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
16e70 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
16e80 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
16e90 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
16ea0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
16eb0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
16ec0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
16ed0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
16ee0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
16ef0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
16f00 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
16f10 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
16f20 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
16f30 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
16f40 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
16f50 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
16f60 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
16f70 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
16f80 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
16f90 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
16fa0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
16fb0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
16fc0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
16fd0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
16fe0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
16ff0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
17000 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
17010 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
17020 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
17030 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
17040 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
17050 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
17060 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
17070 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
17080 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
17090 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
170a0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
170b0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
170c0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
170d0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
170e0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
170f0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
17100 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
17110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
17120 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17130 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17150 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
17160 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
17180 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17190 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
171a0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
171b0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
171c0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
171d0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
17200 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17210 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
17230 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17240 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17250 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
17260 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
17270 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17280 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
172b0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
172c0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
172d0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
172e0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
172f0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
17320 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
17330 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17350 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
17360 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
17370 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
173a0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
173b0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
173c0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
173d0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
173e0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
173f0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
17400 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
17410 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
17420 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
17430 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
17440 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
17450 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
17460 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
17470 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
17480 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
17490 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
174a0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
174b0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
174c0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
174d0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
174e0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
174f0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
17500 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70  e_format, u32 *p
17510 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Len){.  int flag
17520 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
17530 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73  .  u32 n;..  ass
17540 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a  ert( pLen!=0 );.
17550 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
17560 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Null ){.    *pLe
17570 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
17580 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
17590 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
175a0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
175b0 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
175c0 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
175d0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
175e0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
175f0 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
17600 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
17610 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
17620 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
17630 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
17640 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
17650 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
17660 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
17670 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
17680 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
17690 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
176a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
176b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
176c0 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
176d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
176e0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
176f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
17700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17710 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
17720 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
17730 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
17740 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
17750 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
17760 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
17770 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
17780 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
17790 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
177a0 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
177b0 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
177c0 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
177d0 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
177e0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
177f0 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
17800 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
17810 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
17820 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17830 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17840 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
17850 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
17860 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17870 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
17880 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
17890 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
178a0 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
178b0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
178c0 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
178d0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
178e0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
178f0 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
17900 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
17910 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
17920 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
17930 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
17940 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
17950 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
17960 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
17970 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
17980 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
17990 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
179a0 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
179b0 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
179c0 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
179d0 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
179e0 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
179f0 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
17a00 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
17a10 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
17a20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
17a30 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
17a40 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
17a50 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
17a60 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
17a70 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
17a80 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
17a90 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
17aa0 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
17ab0 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
17ac0 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
17ad0 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
17ae0 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
17af0 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
17b00 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
17b10 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
17b20 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
17b30 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
17b40 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
17b50 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
17b60 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
17b70 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
17b80 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
17b90 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
17ba0 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
17bb0 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
17bc0 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
17bd0 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
17be0 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
17bf0 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
17c00 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
17c10 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
17c20 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
17c30 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
17c40 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
17c50 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
17c60 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
17c70 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
17c80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17c90 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
17ca0 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
17cb0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
17cc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
17cd0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
17ce0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
17cf0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
17d00 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
17d10 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
17d20 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
17d30 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
17d40 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
17d50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
17d60 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
17d70 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
17d80 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
17d90 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
17da0 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
17db0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
17dc0 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
17dd0 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
17de0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17df0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
17e00 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
17e10 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
17e20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
17e30 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
17e40 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
17e50 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
17e60 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
17e70 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
17e80 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
17e90 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
17ea0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
17eb0 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
17ec0 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
17ed0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
17ee0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
17ef0 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
17f00 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
17f10 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
17f20 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
17f30 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
17f40 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
17f50 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
17f60 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
17f70 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
17f80 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
17f90 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
17fa0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
17fb0 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
17fc0 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
17fd0 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
17fe0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
17ff0 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
18000 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
18010 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
18020 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
18030 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
18040 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
18050 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
18060 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
18070 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
18080 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
18090 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
180a0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
180b0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
180c0 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
180d0 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
180e0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
180f0 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
18100 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
18110 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
18120 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
18130 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
18140 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
18150 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
18160 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
18170 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
18180 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
18190 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
181a0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
181b0 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
181c0 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
181d0 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
181e0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
181f0 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
18200 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
18210 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
18220 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
18230 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
18240 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
18250 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
18260 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
18270 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
18280 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
18290 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
182a0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
182b0 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
182c0 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
182d0 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
182e0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
182f0 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
18300 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
18310 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
18320 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
18330 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
18340 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
18350 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
18360 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
18370 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
18380 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
18390 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
183a0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
183b0 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
183c0 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
183d0 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
183e0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
183f0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
18400 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
18410 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
18420 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
18430 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
18440 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
18450 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
18460 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
18470 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
18480 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
18490 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
184a0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
184b0 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
184c0 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
184d0 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
184e0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
184f0 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
18500 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
18510 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
18520 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
18530 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
18540 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
18550 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
18560 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
18570 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
18580 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
18590 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
185a0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
185b0 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
185c0 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
185d0 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
185e0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
185f0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
18600 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
18610 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
18620 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
18630 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
18640 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
18650 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18660 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
18670 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
18680 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
18690 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
186a0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
186b0 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
186c0 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
186d0 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
186e0 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
186f0 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
18700 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
18710 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
18720 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
18730 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
18740 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18750 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
18760 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
18770 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
18780 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
18790 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
187a0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
187b0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
187c0 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
187d0 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
187e0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
187f0 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
18800 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18810 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
18820 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
18830 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
18840 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
18850 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
18860 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18870 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
18880 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
18890 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
188a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
188b0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
188c0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
188d0 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
188e0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
188f0 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
18900 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
18910 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
18920 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
18930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
18940 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
18950 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
18960 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
18970 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18980 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
18990 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
189a0 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
189b0 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
189c0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
189d0 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
189e0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
189f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
18a00 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
18a10 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
18a20 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
18a30 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
18a40 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
18a50 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
18a60 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
18a70 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
18a80 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18a90 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
18aa0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
18ab0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
18ac0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
18ad0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
18ae0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
18af0 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
18b00 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
18b10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
18b20 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
18b30 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
18b40 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
18b50 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
18b60 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
18b70 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
18b80 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
18b90 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
18ba0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
18bb0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
18bc0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
18bd0 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
18be0 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
18bf0 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
18c00 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
18c10 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
18c20 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
18c30 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
18c40 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
18c50 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
18c60 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
18c70 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
18c80 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
18c90 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
18ca0 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
18cb0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
18cc0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
18cd0 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
18ce0 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
18cf0 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
18d00 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
18d10 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
18d20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
18d30 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
18d40 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
18d50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18d60 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
18d70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18d80 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
18d90 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
18da0 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
18db0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
18dc0 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
18dd0 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
18de0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
18df0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
18e00 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
18e10 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
18e20 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
18e30 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
18e40 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
18e50 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
18e60 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
18e70 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
18e80 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
18e90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18ea0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
18eb0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
18ec0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
18ed0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ef0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
18f00 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
18f10 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f30 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
18f40 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
18f50 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
18f60 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
18f70 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
18f80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
18f90 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
18fa0 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
18fb0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
18fc0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
18fd0 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
18fe0 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
18ff0 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
19000 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
19010 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19020 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
19030 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
19040 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19050 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
19060 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19070 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
19080 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19090 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
190a0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
190b0 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
190c0 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
190d0 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
190e0 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
190f0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
19100 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
19110 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
19120 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
19130 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
19140 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
19150 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19160 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
19170 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
19180 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
19190 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
191a0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
191b0 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
191c0 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
191d0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
191e0 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
191f0 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
19200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
19210 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
19220 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
19230 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
19240 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
19250 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
19260 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
19270 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19280 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
19290 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
192a0 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
192b0 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
192c0 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
192d0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
192e0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
192f0 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
19300 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
19310 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
19320 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
19330 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
19340 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
19350 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
19360 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
19370 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
19380 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
19390 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
193a0 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
193b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
193c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
193d0 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
193e0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
193f0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
19400 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
19410 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
19420 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
19430 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
19440 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
19470 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
19480 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
19490 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
194a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
194b0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
194c0 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
194d0 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
194e0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
194f0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
19500 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
19510 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
19520 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19530 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
19540 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
19550 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19560 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
19570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19580 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
19590 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
195a0 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
195b0 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
195c0 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
195d0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
195e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
195f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
19600 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
19610 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19620 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19630 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19640 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19650 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
19660 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
19670 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
19680 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
19690 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
196a0 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
196b0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
196c0 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
196d0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
196e0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
196f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19700 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
19710 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
19720 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19730 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19740 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
19760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19770 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
19780 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19790 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
197a0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
197b0 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
197c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
197d0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
197e0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
197f0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
19800 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
19810 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
19820 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19830 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19840 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19850 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19860 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
19870 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
19880 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
19890 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
198a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
198b0 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
198c0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
198d0 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
198e0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
198f0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19900 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19910 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
19920 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
19930 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
19940 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
19950 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
19960 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
19970 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
19980 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
19990 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
199a0 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
199b0 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
199c0 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
199d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
199e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
199f0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19a00 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
19a10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
19a20 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
19a30 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19a40 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19a50 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
19a60 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
19a70 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
19a80 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19a90 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19aa0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19ab0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
19ac0 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
19ad0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
19ae0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
19af0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19b00 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19b10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19b20 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19b30 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
19b40 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
19b50 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
19b60 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19b70 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
19b80 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
19b90 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
19ba0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
19bb0 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
19bc0 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
19bd0 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
19be0 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
19bf0 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
19c00 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
19c10 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
19c20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
19c30 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
19c40 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
19c50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19c60 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
19c70 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
19c80 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
19c90 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
19ca0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
19cb0 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
19cc0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
19cd0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19ce0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
19cf0 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
19d00 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
19d10 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19d20 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
19d30 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
19d40 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19d50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19d60 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
19d70 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
19d80 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
19d90 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
19da0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
19db0 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
19dc0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
19dd0 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
19de0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
19df0 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
19e00 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
19e10 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
19e20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
19e30 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
19e40 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
19e50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
19e60 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
19e70 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
19e80 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
19e90 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
19ea0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
19eb0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
19ec0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
19ed0 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
19ee0 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
19ef0 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
19f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
19f10 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
19f20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
19f30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19f40 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
19f50 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
19f60 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
19f70 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
19f80 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
19f90 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
19fa0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
19fb0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
19fc0 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
19fd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
19fe0 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
19ff0 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1a000 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1a010 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1a020 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1a030 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1a040 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1a050 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1a060 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1a070 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1a080 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1a090 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1a0a0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1a0b0 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1a0c0 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1a0d0 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1a0e0 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1a0f0 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1a100 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1a110 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1a120 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1a130 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1a140 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1a150 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1a160 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1a170 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1a180 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1a190 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1a1a0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1a1b0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1a1c0 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1a1d0 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1a1e0 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1a1f0 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1a200 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a220 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1a230 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68  e record */.  ch
1a240 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20  ar *pSpace,     
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a260 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65   Unaligned space
1a270 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
1a280 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20  int szSpace,    
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63  /* Size of pSpac
1a2b0 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  e[] in bytes */.
1a2c0 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20    char **ppFree 
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72    /* OUT: Caller
1a2f0 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69   should free thi
1a300 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a  s pointer */.){.
1a310 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1a320 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1a330 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
1a340 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
1a350 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20  /.  int nOff;   
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1a380 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20   pSpace by nOff 
1a390 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  to align it */. 
1a3a0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1a3d0 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1a3e0 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20   *p */..  /* We 
1a3f0 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
1a400 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
1a410 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
1a420 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
1a430 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
1a440 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
1a450 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
1a460 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
1a470 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
1a480 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
1a490 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
1a4a0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
1a4b0 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
1a4c0 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
1a4d0 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
1a4e0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
1a4f0 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
1a500 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1a510 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1a520 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1a530 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1a540 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
1a550 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e   nByte>szSpace+n
1a560 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  Off ){.    p = (
1a570 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a580 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1a590 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1a5a0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70  , nByte);.    *p
1a5b0 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  pFree = (char *)
1a5c0 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20  p;.    if( !p ) 
1a5d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1a5e0 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
1a5f0 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70  ckedRecord*)&pSp
1a600 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a  ace[nOff];.    *
1a610 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppFree = 0;.  }.
1a620 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1a630 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1a640 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1a650 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1a660 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1a670 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1a680 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1a690 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1a6a0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1a6b0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1a6c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1a6d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1a6e0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1a6f0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1a700 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1a710 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1a720 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1a730 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1a740 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1a750 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1a760 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1a770 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1a780 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1a790 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1a7a0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1a7b0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1a7c0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1a7d0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1a7e0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1a7f0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1a800 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a810 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1a820 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1a830 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1a840 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1a850 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1a860 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1a870 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1a880 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1a890 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1a8a0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a8b0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1a8c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a8d0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1a8e0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1a910 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1a920 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1a930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a950 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1a960 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1a970 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1a980 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1a990 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1a9a0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1a9b0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1a9c0 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1a9d0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1a9e0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1a9f0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1aa00 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1aa10 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1aa20 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1aa30 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1aa40 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1aa50 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1aa60 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1aa70 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1aa80 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1aa90 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1aaa0 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1aab0 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1aac0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1aad0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1aae0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1aaf0 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1ab00 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
1ab10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1ab20 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
1ab30 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
1ab40 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
1ab50 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d     if( (++u)>=p-
1ab60 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
1ab70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
1ab80 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
1ab90 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
1aba0 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
1abb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1abc0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1abd0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
1abe0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
1abf0 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
1ac00 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
1ac10 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
1ac20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1ac30 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
1ac40 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ac50 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
1ac60 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1ac70 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
1ac80 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
1ac90 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
1aca0 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
1acb0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1acc0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
1acd0 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
1ace0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1acf0 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
1ad00 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
1ad10 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
1ad20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ad30 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
1ad40 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
1ad50 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
1ad60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1ad70 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
1ad80 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
1ad90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1ada0 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
1adb0 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1adc0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
1add0 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
1ade0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1adf0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ae00 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1ae10 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1ae20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1ae30 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1ae40 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1ae50 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1ae60 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
1ae70 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
1ae80 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
1ae90 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
1aea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1aeb0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1aec0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1aed0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1aee0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1aef0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1af00 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
1af10 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
1af20 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1af30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1af40 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
1af50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
1af60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1af70 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1af80 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1af90 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1afa0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
1afb0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1afc0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1afd0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
1afe0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1aff0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1b000 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1b010 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1b020 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
1b030 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1b040 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
1b050 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
1b060 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
1b070 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
1b080 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
1b090 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1b0a0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1b0b0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1b0c0 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1b0d0 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
1b0e0 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
1b0f0 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
1b100 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
1b110 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
1b120 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
1b130 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
1b140 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
1b150 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
1b160 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
1b170 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
1b180 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
1b190 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
1b1a0 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
1b1b0 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
1b1c0 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
1b1d0 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
1b1e0 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
1b1f0 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
1b200 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
1b210 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
1b220 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
1b230 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
1b240 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
1b250 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
1b260 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
1b270 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
1b280 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
1b290 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1b2a0 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
1b2b0 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
1b2c0 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
1b2d0 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
1b2e0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
1b2f0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1b300 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1b310 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
1b320 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
1b330 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1b340 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
1b350 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b360 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1b370 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1b380 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
1b390 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1b3a0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
1b3b0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1b3c0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b3d0 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1b3e0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1b3f0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1b400 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1b410 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1b420 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
1b430 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
1b440 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
1b450 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
1b460 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
1b470 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
1b480 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
1b490 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
1b4a0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1b4b0 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1b4c0 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1b4d0 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1b4e0 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1b4f0 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1b500 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1b510 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1b520 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1b530 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1b540 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1b550 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1b560 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1b570 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1b580 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1b590 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1b5a0 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1b5b0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1b5c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1b5d0 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1b5e0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1b5f0 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
1b600 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
1b610 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
1b620 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1b630 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1b640 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
1b650 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
1b660 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b670 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1b680 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
1b690 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
1b6a0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1b6b0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b6c0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1b6d0 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
1b6e0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
1b6f0 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
1b700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
1b710 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
1b720 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
1b730 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
1b740 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
1b750 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
1b760 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1b770 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1b780 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1b790 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1b7a0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1b7b0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1b7c0 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1b7d0 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1b7e0 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1b7f0 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1b800 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1b810 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1b820 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1b830 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1b840 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1b850 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1b860 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1b870 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1b880 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1b890 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1b8a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1b8b0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1b8c0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1b8d0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1b8e0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1b8f0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1b900 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1b910 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1b920 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1b930 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1b940 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1b950 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1b960 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1b970 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1b980 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1b990 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1b9a0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1b9b0 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1b9c0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1b9d0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1b9e0 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1b9f0 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1ba00 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1ba10 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1ba20 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1ba30 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1ba40 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1ba50 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1ba60 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1ba70 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1ba80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1ba90 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1baa0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1bab0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1bac0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1bad0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1bae0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
1baf0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1bb00 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1bb10 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1bb20 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1bb30 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1bb40 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1bb50 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1bb60 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1bb70 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1bb80 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1bb90 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1bba0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1bbb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1bbc0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1bbd0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1bbe0 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1bbf0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1bc00 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1bc10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1bc20 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1bc30 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1bc40 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1bc50 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1bc60 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1bc70 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1bc80 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1bc90 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1bca0 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1bcb0 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1bcc0 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1bcd0 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1bce0 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1bcf0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1bd00 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1bd10 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1bd20 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1bd30 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1bd40 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1bd50 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1bd60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1bd70 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1bd80 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1bd90 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1bda0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1bdb0 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1bdc0 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1bdd0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1bde0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1bdf0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1be00 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1be10 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1be20 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1be30 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1be40 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1be50 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1be60 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1be70 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1be80 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1be90 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1bea0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1beb0 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1bec0 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1bed0 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1bee0 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1bef0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1bf00 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1bf10 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1bf20 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1bf30 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1bf40 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1bf50 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1bf60 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1bf70 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1bf80 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1bf90 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1bfa0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1bfb0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1bfc0 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1bfd0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1bfe0 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1bff0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1c000 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1c010 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1c020 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1c030 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1c040 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1c050 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1c060 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1c070 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1c080 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1c090 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1c0a0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1c0b0 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1c0c0 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1c0d0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1c0e0 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1c110 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1c120 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1c130 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1c140 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1c150 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1c160 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1c170 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1c180 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1c190 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1c1a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1c1b0 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1c1c0 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1c1d0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1c1e0 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1c1f0 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1c200 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c210 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1c220 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1c230 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1c240 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1c250 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1c260 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1c270 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1c280 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1c290 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1c2a0 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1c2b0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1c2c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1c2d0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1c2e0 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1c2f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c300 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1c310 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1c320 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1c330 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1c340 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1c350 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1c360 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1c370 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1c380 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1c390 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1c3a0 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1c3b0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1c3c0 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1c3d0 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1c3e0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1c3f0 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1c400 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
1c410 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1c420 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1c430 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1c440 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69  ease(&c2);.    i
1c450 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1c460 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1c470 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1c480 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1c490 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1c4a0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1c4b0 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1c4c0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1c4d0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1c4e0 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1c4f0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1c500 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1c510 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1c520 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1c530 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1c540 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1c550 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1c560 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1c570 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1c580 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1c590 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1c5a0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1c5b0 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1c5c0 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20   *pB2){.  int c 
1c5d0 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1c5e0 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e   pB2->z, pB1->n>
1c5f0 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20  pB2->n ? pB2->n 
1c600 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28  : pB1->n);.  if(
1c610 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1c620 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d   return pB1->n -
1c630 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   pB2->n;.}../*.*
1c640 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f  * Do a compariso
1c650 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62  n between a 64-b
1c660 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1c670 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66  r and a 64-bit f
1c680 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a  loating-point.**
1c690 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
1c6a0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1c6b0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1c6c0 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20  the first (i64) 
1c6d0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a  is less than,.**
1c6e0 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1c6f0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1c700 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a  econd (double)..
1c710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1c720 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1c730 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62  pare(i64 i, doub
1c740 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a  le r){.  if( siz
1c750 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54  eof(LONGDOUBLE_T
1c760 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f  YPE)>8 ){.    LO
1c770 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20  NGDOUBLE_TYPE x 
1c780 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  = (LONGDOUBLE_TY
1c790 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c  PE)i;.    if( x<
1c7a0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1c7b0 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74     if( x>r ) ret
1c7c0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1c7d0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1c7e0 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f     i64 y;.    do
1c7f0 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20  uble s;.    if( 
1c800 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r<-9223372036854
1c810 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72  775808.0 ) retur
1c820 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e  n +1;.    if( r>
1c830 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1c840 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d  807.0 ) return -
1c850 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29  1;.    y = (i64)
1c860 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29  r;.    if( i<y )
1c870 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c880 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20  if( i>y ){.     
1c890 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54   if( y==SMALLEST
1c8a0 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20  _INT64 && r>0.0 
1c8b0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1c8c0 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
1c8d0 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75    }.    s = (dou
1c8e0 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73  ble)i;.    if( s
1c8f0 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1c900 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65      if( s>r ) re
1c910 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1c920 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
1c930 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1c940 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
1c950 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
1c960 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
1c970 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
1c980 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
1c990 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
1c9a0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1c9b0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
1c9c0 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
1c9d0 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
1c9e0 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
1c9f0 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
1ca00 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
1ca10 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
1ca20 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
1ca30 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
1ca40 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c  ered by the coll
1ca50 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1ca60 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61  e pColl and fina
1ca70 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72  lly blob's order
1ca80 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a  ed by memcmp()..
1ca90 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76  **.** Two NULL v
1caa0 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1cab0 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68  ered equal by th
1cac0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
1cad0 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  int sqlite3MemCo
1cae0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1caf0 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65  *pMem1, const Me
1cb00 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20  m *pMem2, const 
1cb10 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
1cb20 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20  .  int f1, f2;. 
1cb30 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
1cb40 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65  ags;..  f1 = pMe
1cb50 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
1cb60 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
1cb70 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
1cb80 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65   = f1|f2;.  asse
1cb90 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c  rt( (combined_fl
1cba0 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
1cbb0 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49  )==0 );. .  /* I
1cbc0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
1cbd0 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
1cbe0 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
1cbf0 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
1cc00 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
1cc10 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
1cc20 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1cc30 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
1cc40 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d    return (f2&MEM
1cc50 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d  _Null) - (f1&MEM
1cc60 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Null);.  }..  /
1cc70 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  * At least one o
1cc80 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  f the two values
1cc90 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a   is a number.  *
1cca0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1ccb0 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c  _flags&(MEM_Int|
1ccc0 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20  MEM_Real) ){.   
1ccd0 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1cce0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1ccf0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1cd00 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i < pMem2->u.i
1cd10 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1cd20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1cd30 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
1cd40 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1cd50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1cd60 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26   }.    if( (f1 &
1cd70 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21   f2 & MEM_Real)!
1cd80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cd90 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65  pMem1->u.r < pMe
1cda0 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1cdb0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1cdc0 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d  Mem1->u.r > pMem
1cdd0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1cde0 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1cdf0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ce00 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
1ce10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1ce20 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f2&MEM_Real)!=0 
1ce30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ce40 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  n sqlite3IntFloa
1ce50 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e  tCompare(pMem1->
1ce60 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29  u.i, pMem2->u.r)
1ce70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ce80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1ce90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cea0 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1ceb0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1cec0 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e    if( (f2&MEM_In
1ced0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
1cee0 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33   return -sqlite3
1cef0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1cf00 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem2->u.i, pMem
1cf10 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  1->u.r);.      }
1cf20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1cf30 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1cf40 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1cf50 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n +1;.  }..  /* 
1cf60 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1cf70 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1cf80 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1cf90 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1cfa0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1cfb0 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1cfc0 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1cfd0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1cfe0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1cff0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1d000 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1d010 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1d020 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1d030 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1d040 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1d050 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1d060 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1d070 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1d080 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1d090 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73  2->enc );.    as
1d0a0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1d0b0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1d0c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1d0d0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d0e0 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1d0f0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1d100 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1d110 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1d120 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1d130 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1d140 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1d150 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1d160 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1d170 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1d180 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1d190 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1d1a0 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1d1b0 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1d1c0 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1d1d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1d1e0 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1d1f0 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1d200 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1d210 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1d220 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1d230 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1d240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1d250 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1d260 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1d270 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1d280 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1d290 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1d2a0 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1d2b0 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1d2c0 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1d2d0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1d2e0 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1d2f0 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1d300 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1d310 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1d320 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1d330 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1d340 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1d350 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1d360 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1d370 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1d380 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1d390 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1d3a0 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1d3b0 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1d3c0 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1d3d0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1d3e0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1d3f0 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1d400 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1d410 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1d420 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1d430 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1d440 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1d450 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1d460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1d470 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1d480 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1d490 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1d4a0 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1d4b0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1d4c0 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1d4d0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1d4e0 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1d4f0 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1d500 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1d510 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1d520 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1d530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d540 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d550 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1d560 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d570 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1d580 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d590 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d5a0 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_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 33 3a 0a 20 20 20 20 20 20    case 3:.      
1d5d0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1d5e0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1d5f0 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1d600 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d610 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1d620 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d630 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d640 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1d650 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d660 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1d670 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1d680 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1d690 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d6a0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d6b0 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1d6c0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1d6d0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1d6e0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1d6f0 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1d700 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1d710 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1d720 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1d730 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d740 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d750 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1d760 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d770 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1d780 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1d790 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1d7a0 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1d7b0 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1d7c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d7d0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1d7e0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1d7f0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1d800 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1d810 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1d820 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1d830 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1d840 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1d850 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1d860 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1d870 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1d880 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1d890 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1d8a0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1d8b0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1d8c0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1d8d0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1d8e0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1d8f0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1d900 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1d910 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1d920 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1d930 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1d940 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1d950 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1d960 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1d970 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1d980 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1d990 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1d9a0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1d9b0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1d9c0 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1d9d0 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1d9e0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1d9f0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1da00 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1da10 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1da20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1da30 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1da40 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1da50 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1da60 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1da70 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1da80 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1da90 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1daa0 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1dab0 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1dac0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1dad0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1dae0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1daf0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1db00 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1db10 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1db20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1db30 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1db40 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1db50 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1db60 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1db70 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1db80 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1db90 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1dba0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1dbb0 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1dbc0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1dbd0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1dbe0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1dbf0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1dc00 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1dc10 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1dc20 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1dc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1dc40 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1dc50 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1dc60 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1dc90 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1dca0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1dcb0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1dce0 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1dcf0 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1dd00 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1dd20 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1dd30 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1dd40 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1dd70 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1dd80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1dd90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dda0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ddb0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1ddc0 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1ddd0 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1dde0 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1ddf0 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1de00 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1de10 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1de20 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1de30 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1de40 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1de50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1de60 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1de70 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1de80 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1de90 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1dea0 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1deb0 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1dec0 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1ded0 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1dee0 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1def0 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1df00 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1df10 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1df20 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1df30 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1df40 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1df50 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1df60 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1df70 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1df80 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1df90 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1dfa0 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1dfb0 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1dfc0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1dfd0 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1dfe0 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1dff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e000 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1e010 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1e020 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1e030 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1e040 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1e050 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1e060 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1e070 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e080 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1e090 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1e0a0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1e0b0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1e0c0 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1e0d0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1e0e0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1e0f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e100 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1e110 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e120 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1e130 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1e140 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1e150 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1e160 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1e170 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e180 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1e190 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1e1a0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1e1b0 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1e1c0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1e1d0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1e1e0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1e1f0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1e200 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1e210 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1e220 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1e230 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1e240 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1e250 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1e260 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e270 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1e280 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1e290 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1e2a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1e2b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1e2c0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1e2d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e2e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e2f0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e300 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1e310 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e320 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e330 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e340 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1e350 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1e360 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1e370 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1e380 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e390 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1e3a0 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1e3b0 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1e3c0 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1e3d0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1e3e0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1e3f0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1e400 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e410 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1e420 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1e430 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e440 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1e450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e460 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1e470 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1e480 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1e490 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1e4a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1e4b0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1e4c0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1e4d0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1e4e0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1e4f0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1e500 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1e510 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1e520 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1e530 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1e540 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1e550 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1e560 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1e570 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1e580 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1e590 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1e5a0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1e5b0 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1e5c0 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1e5d0 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1e5e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1e5f0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1e600 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e620 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e630 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e640 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1e650 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1e660 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1e670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1e680 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1e690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1e6a0 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1e6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e6c0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e6d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1e6e0 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1e6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1e700 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1e710 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1e730 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1e740 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1e750 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1e760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1e780 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1e790 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1e7a0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1e7b0 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1e7c0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1e7d0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1e7e0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1e7f0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e800 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e810 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1e820 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1e830 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e840 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1e850 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1e860 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1e870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e880 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1e890 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1e8a0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1e8b0 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1e8c0 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1e8d0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1e8e0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1e8f0 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1e900 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1e910 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1e920 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1e930 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1e940 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1e950 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1e960 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e970 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1e980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e990 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1e9a0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1e9b0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1e9c0 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1e9d0 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1e9e0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1e9f0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1ea00 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1ea10 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1ea20 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1ea30 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1ea40 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1ea50 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1ea60 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1ea70 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1ea80 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1ea90 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1eaa0 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1eab0 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1eac0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1ead0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1eae0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1eaf0 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1eb00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1eb10 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1eb20 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1eb30 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1eb40 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1eb50 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1eb60 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1eb70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1eb80 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1eb90 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1eba0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1ebb0 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1ebc0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ebd0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1ebe0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1ebf0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1ec00 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ec10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ec20 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1ec30 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1ec40 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1ec50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec60 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1ec70 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1ec80 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1ec90 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1eca0 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1ecb0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ecc0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1ecd0 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1ece0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1ecf0 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1ed00 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1ed10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1ed20 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1ed30 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ed40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1ed50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed70 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1ed80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ed90 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1eda0 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
1edb0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1edc0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1edd0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1ede0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1edf0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1ee00 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1ee10 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1ee20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ee30 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
1ee40 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
1ee50 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1ee60 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1ee70 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
1ee80 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
1ee90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1eea0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
1eeb0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1eec0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1eed0 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
1eee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
1eef0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ef00 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1ef10 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
1ef20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ef30 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1ef40 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1ef50 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1ef60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ef70 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
1ef80 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
1ef90 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1efa0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1efb0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1efc0 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
1efd0 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
1efe0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
1eff0 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
1f000 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1f010 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31  y2->nField && d1
1f020 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
1f030 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
1f040 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1f050 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1f060 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1f070 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1f080 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1f090 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1f0a0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1f0b0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1f0c0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1f0d0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1f0e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f0f0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
1f100 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1f110 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1f120 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1f130 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1f140 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
1f150 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1f160 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1f170 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1f180 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1f190 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1f1a0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1f1b0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1f1c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1f1d0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
1f1e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f1f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1f200 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
1f210 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f220 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65  ) .       || pKe
1f230 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1f240 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
1f250 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
1f260 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
1f270 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1f280 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1f290 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
1f2a0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1f2b0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1f2c0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1f2d0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1f2e0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1f2f0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1f300 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
1f310 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f320 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1f330 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f340 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
1f350 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f360 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1f370 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1f380 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f390 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1f3a0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1f3b0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1f3c0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1f3d0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1f3e0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1f3f0 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1f400 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1f410 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1f420 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1f430 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1f440 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1f450 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1f460 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1f470 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1f480 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1f490 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1f4a0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1f4b0 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1f4c0 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1f4d0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1f4e0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1f4f0 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1f500 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1f510 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1f520 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1f530 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1f540 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1f550 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1f560 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
1f570 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1f580 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
1f590 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
1f5a0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
1f5b0 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
1f5c0 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
1f5d0 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
1f5e0 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70  4 x;.  i64 v = p
1f5f0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
1f600 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a  .i;.  i64 lhs;..
1f610 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
1f620 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1f630 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
1f640 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1f650 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
1f660 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
1f670 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
1f680 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1f690 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1f6a0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1f6b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f6c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f6d0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1f6e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f6f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f710 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1f720 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1f730 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f740 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1f750 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f760 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1f770 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f790 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1f7a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1f7b0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1f7c0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1f7d0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f7e0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f7f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f800 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1f810 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1f820 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f830 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1f840 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f850 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1f860 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1f870 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f890 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1f8a0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1f8b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f8c0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1f8d0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1f8e0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1f8f0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1f900 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f910 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f930 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1f940 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1f950 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f960 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1f970 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f980 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1f990 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f9a0 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1f9b0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1f9c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f9d0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f9e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f9f0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1fa00 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1fa10 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1fa20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1fa30 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1fa40 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1fa50 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1fa60 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1fa70 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1fa80 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1fa90 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1faa0 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1fab0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1fac0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1fad0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1fae0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1faf0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1fb00 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1fb10 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1fb20 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1fb30 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1fb40 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1fb50 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1fb60 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1fb70 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1fb80 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1fb90 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1fba0 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1fbb0 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1fbc0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1fbd0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1fbe0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1fbf0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1fc00 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1fc10 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fc20 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
1fc30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1fc40 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fc50 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1fc60 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
1fc70 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  }..  if( v>lhs )
1fc80 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1fc90 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
1fca0 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
1fcb0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1fcc0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
1fcd0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1fce0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
1fcf0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1fd00 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1fd10 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
1fd20 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
1fd30 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
1fd40 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1fd50 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1fd60 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1fd70 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1fd80 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1fd90 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1fda0 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1fdb0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
1fdc0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
1fdd0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
1fde0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
1fdf0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1fe00 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
1fe10 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
1fe20 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1fe30 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
1fe40 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
1fe50 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
1fe60 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1fe70 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1fe80 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
1fe90 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1fea0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1feb0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1fec0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1fed0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fee0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1fef0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1ff00 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1ff10 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
1ff20 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
1ff30 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
1ff40 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1ff50 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
1ff60 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
1ff70 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1ff80 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
1ff90 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1ffa0 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1ffb0 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
1ffc0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1ffd0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1ffe0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1fff0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
20000 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
20010 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20020 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20030 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20040 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20050 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
20060 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
20070 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
20080 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
20090 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
200a0 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
200b0 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
200c0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
200d0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
200e0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
200f0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
20100 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
20110 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
20120 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
20130 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
20140 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
20150 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
20160 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
20170 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
20180 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20190 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
201a0 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
201b0 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
201c0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
201d0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
201e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
201f0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
20200 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
20210 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
20220 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
20230 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
20240 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
20250 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
20260 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20270 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20280 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20290 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
202a0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
202b0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
202c0 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
202d0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
202e0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
202f0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
20300 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
20310 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
20320 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
20330 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
20340 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
20350 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
20360 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
20370 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
20380 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
20390 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
203a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
203b0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
203c0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
203d0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
203e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
203f0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
20400 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
20410 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
20420 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
20430 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
20440 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
20450 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20460 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
20470 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
20480 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
20490 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
204a0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
204b0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
204c0 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
204d0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
204e0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
204f0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
20500 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
20510 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
20520 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
20530 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
20540 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
20550 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
20560 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
20570 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
20580 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
20590 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
205a0 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
205b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
205c0 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
205d0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
205e0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
205f0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
20600 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
20610 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
20620 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
20630 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
20640 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
20650 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
20660 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
20670 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
20680 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
20690 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
206a0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
206b0 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
206c0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
206d0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
206e0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
206f0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
20700 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
20710 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
20720 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
20730 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
20740 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20750 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
20760 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
20770 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
20780 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
20790 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
207a0 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
207b0 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
207c0 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
207d0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
207e0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
207f0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
20800 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
20810 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
20820 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
20830 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
20840 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
20850 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
20860 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
20870 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
20880 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
20890 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
208a0 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
208b0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
208c0 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
208d0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
208e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
208f0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
20900 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
20910 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
20920 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
20930 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
20940 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
20950 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
20960 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
20970 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
20980 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
20990 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
209a0 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
209b0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
209c0 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
209d0 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
209e0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
209f0 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
20a00 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
20a10 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
20a20 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
20a30 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
20a40 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
20a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20a60 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
20a70 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
20a80 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
20a90 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
20aa0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
20ab0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
20ad0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
20ae0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
20af0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
20b00 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
20b10 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20b20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
20b30 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
20b40 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
20b50 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
20b60 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
20b70 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
20b80 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
20b90 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
20ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20bb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
20bc0 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
20bd0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20be0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20bf0 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
20c00 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
20c10 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
20c20 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
20c30 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
20c40 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
20c50 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
20c60 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
20c70 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
20c80 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
20c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20ca0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
20cb0 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
20cc0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
20cd0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
20ce0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
20cf0 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
20d00 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
20d10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
20d20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
20d30 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
20d40 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
20d50 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
20d60 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
20d70 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
20d80 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
20d90 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
20da0 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
20db0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
20dc0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
20dd0 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
20de0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
20df0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
20e00 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
20e10 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
20e20 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
20e30 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
20e40 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
20e50 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
20e60 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
20e70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
20e80 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
20e90 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
20ea0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
20eb0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
20ec0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
20ed0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
20ee0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
20ef0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
20f00 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
20f10 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
20f20 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
20f30 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
20f40 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
20f50 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
20f60 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
20f70 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
20f80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
20f90 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
20fa0 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
20fb0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
20fc0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
20fd0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
20fe0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
20ff0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
21000 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
21010 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
21020 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
21030 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
21040 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
21050 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
21060 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
21070 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
21080 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
21090 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
210a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
210b0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
210c0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
210d0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
210e0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
210f0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
21100 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21120 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
21130 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
21140 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
21150 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
21160 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
21170 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
21180 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
21190 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
211a0 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
211b0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
211c0 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
211d0 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
211e0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
211f0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
21200 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
21210 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
21220 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
21230 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
21240 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
21250 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
21260 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
21270 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
21280 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
21290 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
212a0 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
212b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
212c0 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
212d0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
212e0 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
212f0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21300 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
21310 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
21320 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21330 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
21340 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21350 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
21360 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21370 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
21380 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
21390 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
213a0 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
213b0 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
213c0 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
213d0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
213e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
213f0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
21400 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
21410 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
21420 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
21430 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
21440 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
21450 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
21460 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
21470 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21480 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21490 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
214a0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
214b0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
214c0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
214d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
214e0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
214f0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
21500 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
21510 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
21520 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
21530 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
21540 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21550 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
21560 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
21570 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
21580 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
21590 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
215a0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
215b0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
215c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
215d0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
215e0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
215f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
21600 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
21610 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
21620 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
21630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21640 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
21650 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
21660 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
21670 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
21680 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
21690 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
216a0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
216b0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
216c0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
216d0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
216e0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
216f0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
21700 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
21710 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
21720 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
21730 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
21740 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
21750 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
21760 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
21770 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
21780 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
21790 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
217a0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
217b0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
217c0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
217d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
217e0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
217f0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
21800 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
21810 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
21820 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
21830 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
21840 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
21850 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
21860 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
21870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
21880 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
21890 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
218c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
218d0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
21900 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
21910 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
21920 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
21930 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
21940 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
21950 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
21960 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
21970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21980 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
21990 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
219a0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
219b0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
219c0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
219d0 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
219e0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
219f0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
21a00 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
21a10 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
21a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21a30 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
21a40 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
21a50 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
21a60 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
21a70 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
21a80 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
21a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
21aa0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
21ab0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
21ac0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
21ad0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
21ae0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
21af0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
21b00 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
21b10 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
21b20 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
21b30 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
21b40 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
21b50 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
21b60 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
21b70 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
21b80 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
21b90 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
21ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21bb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21bc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
21bd0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
21be0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
21bf0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
21c00 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
21c10 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
21c20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21c30 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21c40 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
21c50 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21c60 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
21c70 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
21c80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
21c90 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
21ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21cb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
21cc0 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
21cd0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
21ce0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
21cf0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
21d00 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
21d10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
21d20 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
21d30 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
21d40 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
21d50 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
21d60 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
21d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21d80 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
21d90 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
21da0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
21db0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
21dc0 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
21dd0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
21de0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
21df0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
21e00 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
21e10 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
21e20 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
21e30 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
21e40 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
21e50 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
21e60 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
21e70 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
21e80 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
21e90 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
21ea0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21eb0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
21ec0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
21ed0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
21ee0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
21ef0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
21f00 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
21f10 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
21f20 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
21f30 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
21f40 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
21f50 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
21f60 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
21f70 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
21f80 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
21f90 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
21fa0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
21fb0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
21fc0 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
21fd0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
21fe0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
21ff0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
22000 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
22010 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
22020 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
22030 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
22040 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
22050 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
22060 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
22070 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
22080 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
22090 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
220a0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
220b0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
220c0 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
220d0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
220e0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
220f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22100 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
22110 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
22120 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
22130 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
22140 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
22150 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
22160 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
22170 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
22180 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
22190 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
221a0 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
221b0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
221c0 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
221d0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
221e0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
221f0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
22200 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
22210 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
22220 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
22230 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
22240 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
22250 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
22260 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
22270 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
22280 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
22290 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
222a0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
222b0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
222c0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
222d0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
222e0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
222f0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
22300 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
22310 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
22320 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
22330 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
22340 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
22350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22360 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
22370 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
22380 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
22390 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
223a0 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
223b0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
223c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
223d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
223e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
223f0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
22400 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
22410 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
22420 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
22430 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
22440 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
22450 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
22460 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
22470 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
22480 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
22490 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
224a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
224b0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
224c0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
224d0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
224e0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
224f0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
22500 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
22510 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
22520 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
22530 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
22540 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
22550 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22560 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  TABLE./*.** Tran
22570 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
22580 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
22590 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
225a0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
225b0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
225c0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
225d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
225e0 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
225f0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
22600 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
22610 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22620 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f  DbMalloc)..*/.vo
22630 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  id sqlite3VtabIm
22640 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20  portErrmsg(Vdbe 
22650 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
22660 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
22670 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
22680 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22690 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
226a0 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
226b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
226c0 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
226d0 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg);.  sqlite3_
226e0 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
226f0 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
22700 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65  ErrMsg = 0;.}.#e
22710 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22720 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
22730 20 2a 2f 0a                                       */.