/ Hex Artifact Content
Login

Artifact 16e21a6ae0c290f17f6e7395d80686622cafeaa2:


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 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16cc0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16cd0 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  TREE );.  if( p-
16ce0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
16cf0 29 7b 0a 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 7d 0a 20 20 69 66 28  to(p);.  }.  if(
16d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
16d30 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
16d40 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
16d50 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
16d60 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
16d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16d80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16d90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
16da0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
16db0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16dc0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
16dd0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
16de0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
16df0 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
16e00 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
16e10 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
16e20 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16e30 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
16e40 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
16e50 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
16e60 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
16e70 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
16e80 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
16e90 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
16ea0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
16eb0 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
16ec0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
16ed0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
16ee0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
16ef0 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
16f00 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
16f10 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
16f20 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
16f30 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
16f40 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
16f50 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
16f60 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
16f70 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
16f80 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
16f90 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
16fa0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
16fb0 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
16fc0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
16fd0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16fe0 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
16ff0 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
17000 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
17010 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
17020 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
17030 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
17040 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
17050 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
17060 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
17070 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17080 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
17090 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
170a0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
170b0 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
170c0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
170d0 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
170e0 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
170f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
17100 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17110 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
17120 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
17150 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
17180 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17190 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
171b0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
171c0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
171d0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
171e0 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
171f0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17200 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
17230 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17240 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
17250 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
17260 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17270 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
172a0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
172b0 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
172d0 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
172e0 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
17310 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
17320 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
17350 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
17360 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17390 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
173a0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
173b0 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
173c0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
173d0 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
173e0 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
173f0 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
17400 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
17410 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
17420 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
17430 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
17440 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
17450 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
17460 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
17470 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
17480 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
17490 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
174a0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
174b0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
174c0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
174d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
174e0 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
174f0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
17500 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
17510 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
17520 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
17530 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
17540 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
17550 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
17560 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
17570 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
17580 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
17590 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
175a0 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
175b0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
175c0 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
175d0 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
175e0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
175f0 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
17600 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
17610 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
17620 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
17630 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
17640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17650 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
17660 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
17670 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
17680 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
17690 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
176a0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
176b0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
176c0 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
176d0 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
176e0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
176f0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
17700 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
17710 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
17720 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
17730 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
17740 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
17750 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
17760 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
17770 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
17780 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
17790 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
177a0 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
177b0 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
177c0 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
177d0 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
177e0 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
177f0 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
17800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
17810 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
17820 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
17830 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
17840 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
17850 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
17860 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
17870 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
17880 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
17890 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
178a0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
178b0 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
178c0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
178d0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
178e0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
178f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
17900 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
17910 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
17920 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
17930 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
17940 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
17950 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
17960 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
17970 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
17980 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
17990 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
179a0 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
179b0 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
179c0 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
179d0 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
179e0 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
179f0 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
17a00 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
17a10 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
17a20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
17a30 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
17a40 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
17a50 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
17a60 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
17a70 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
17a80 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
17a90 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
17aa0 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
17ab0 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
17ac0 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
17ad0 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
17ae0 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
17af0 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
17b00 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
17b10 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
17b20 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
17b30 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
17b40 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
17b50 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
17b60 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
17b70 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
17b80 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
17b90 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
17ba0 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
17bb0 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
17bc0 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
17bd0 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
17be0 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
17bf0 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
17c00 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
17c10 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
17c20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
17c30 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
17c40 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
17c50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
17c60 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
17c70 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17c80 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
17c90 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
17ca0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
17cb0 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
17cc0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
17cd0 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
17ce0 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
17cf0 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
17d00 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
17d10 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
17d20 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
17d30 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
17d40 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
17d50 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17d60 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
17d70 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
17d80 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
17d90 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
17da0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
17db0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
17dc0 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
17dd0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
17de0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
17df0 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
17e00 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
17e10 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
17e20 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
17e30 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
17e40 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
17e50 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
17e60 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
17e70 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
17e80 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
17e90 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
17ea0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
17eb0 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
17ec0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
17ed0 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
17ee0 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
17ef0 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
17f00 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
17f10 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
17f20 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
17f30 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
17f40 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
17f50 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
17f60 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
17f70 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
17f80 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
17f90 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
17fa0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
17fb0 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
17fc0 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
17fd0 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
17fe0 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
17ff0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
18000 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
18010 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
18020 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
18030 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
18040 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
18050 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
18060 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
18070 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
18080 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
18090 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
180a0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
180b0 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
180c0 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
180d0 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
180e0 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
180f0 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
18100 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
18110 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
18120 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
18130 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
18140 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
18150 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
18160 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
18170 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
18180 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
18190 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
181a0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
181b0 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
181c0 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
181d0 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
181e0 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
181f0 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
18200 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
18210 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
18220 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
18230 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
18240 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
18250 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
18260 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
18270 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
18280 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
18290 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
182a0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
182b0 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
182c0 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
182d0 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
182e0 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
182f0 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
18300 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
18310 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
18320 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
18330 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
18340 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
18350 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
18360 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
18370 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
18380 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
18390 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
183a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
183b0 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
183c0 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
183d0 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
183e0 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
183f0 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
18400 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
18410 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
18420 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
18430 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
18440 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
18450 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
18460 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
18470 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
18480 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
18490 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
184a0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
184b0 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
184c0 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
184d0 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
184e0 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
184f0 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
18500 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
18510 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
18520 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
18530 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
18540 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
18550 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
18560 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
18570 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
18580 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18590 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
185a0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
185b0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
185c0 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
185d0 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
185e0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
185f0 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
18600 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
18610 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
18620 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
18630 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
18640 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18650 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
18660 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
18670 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
18680 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
18690 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
186a0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
186b0 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
186c0 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
186d0 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
186e0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
186f0 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
18700 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
18710 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
18720 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
18730 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18740 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18750 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
18760 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
18770 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
18780 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
18790 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
187a0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
187b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
187c0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
187d0 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
187e0 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
187f0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
18800 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
18810 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
18820 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
18830 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
18840 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
18850 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
18860 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
18870 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
18880 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
18890 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
188a0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
188b0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
188c0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
188d0 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
188e0 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
188f0 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
18900 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
18910 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
18920 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18930 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
18940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
18950 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
18960 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18970 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
18980 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
18990 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
189a0 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
189b0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
189c0 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
189d0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
189e0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
189f0 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
18a00 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18a10 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
18a20 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
18a30 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
18a40 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
18a50 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
18a60 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
18a70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18a80 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
18a90 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
18aa0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
18ab0 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
18ac0 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
18ad0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
18ae0 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
18af0 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
18b00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18b10 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
18b20 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
18b30 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
18b40 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
18b50 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
18b60 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
18b70 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
18b80 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
18b90 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
18ba0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
18bb0 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
18bc0 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
18bd0 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
18be0 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
18bf0 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
18c00 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
18c10 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
18c20 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
18c30 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
18c40 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
18c50 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
18c60 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
18c70 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
18c80 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
18c90 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
18ca0 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
18cb0 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
18cc0 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
18cd0 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
18ce0 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
18cf0 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
18d00 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
18d10 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
18d20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
18d30 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
18d40 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
18d50 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
18d60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
18d70 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
18d80 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
18d90 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
18da0 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
18db0 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
18dc0 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
18dd0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
18de0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
18df0 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
18e00 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
18e10 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
18e20 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
18e30 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
18e40 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
18e50 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
18e60 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
18e70 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
18e80 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
18e90 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
18ea0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
18eb0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
18ec0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
18ed0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
18ee0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
18ef0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
18f00 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
18f30 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
18f40 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
18f50 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
18f60 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
18f70 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
18f80 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
18f90 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
18fa0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
18fb0 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  =6 ){.    /* EVI
18fc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35  DENCE-OF: R-2985
18fd0 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73  1-52272 Value is
18fe0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34   a big-endian 64
18ff0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73  -bit.    ** twos
19000 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
19010 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  ger. */.    pMem
19020 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
19030 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
19040 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19050 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19060 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
19070 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
19080 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d  NCE-OF: R-57343-
19090 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61  49114 Value is a
190a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45   big-endian IEEE
190b0 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74   754-2008 64-bit
190c0 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67  .    ** floating
190d0 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
190e0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
190f0 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
19100 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
19110 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
19120 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
19130 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
19140 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
19150 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
19160 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
19170 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
19180 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
19190 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
191a0 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
191b0 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
191c0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
191d0 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
191e0 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
191f0 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
19200 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
19210 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
19220 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
19230 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
19240 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
19250 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
19260 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19270 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
19280 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19290 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
192a0 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
192b0 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
192c0 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
192d0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
192e0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
192f0 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
19300 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
19310 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
19320 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
19330 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
19340 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
19350 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
19360 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
19370 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
19380 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
19390 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
193a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
193b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
193c0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
193d0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
193e0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
193f0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
19400 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
19410 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
19420 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
19430 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
19440 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
19450 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
19460 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
19470 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
19480 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
19490 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
194a0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
194b0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
194c0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
194d0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
194e0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
194f0 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
19500 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20   /* Null */.    
19510 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19520 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20  : R-24078-09375 
19530 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e  Value is a NULL.
19540 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19550 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
19560 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19570 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
19580 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
19590 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35  ENCE-OF: R-44885
195a0 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20  -25196 Value is 
195b0 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f  an 8-bit twos-co
195c0 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  mplement.      *
195d0 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  * integer. */.  
195e0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
195f0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  ONE_BYTE_INT(buf
19600 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19610 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19630 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19640 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19650 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
19660 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
19670 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19680 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19690 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30  -OF: R-49794-350
196a0 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  26 Value is a bi
196b0 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a  g-endian 16-bit.
196c0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
196d0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
196e0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
196f0 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f  >u.i = TWO_BYTE_
19700 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
19710 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19720 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
19730 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19740 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19750 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
19760 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
19770 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19780 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19790 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
197a0 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20  839-54301 Value 
197b0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
197c0 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  24-bit.      ** 
197d0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
197e0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
197f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
19800 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
19810 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19820 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19840 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19850 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
19860 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
19870 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
19880 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19890 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
198a0 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30  -OF: R-01849-260
198b0 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  79 Value is a bi
198c0 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a  g-endian 32-bit.
198d0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
198e0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
198f0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19900 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
19910 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65  _INT(buf);.#ifde
19920 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20  f __HP_cc .     
19930 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20   /* Work around 
19940 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e  a sign-extension
19950 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63   bug in the HP c
19960 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55  ompiler for HP/U
19970 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  X */.      if( b
19980 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65  uf[0]&0x80 ) pMe
19990 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66  m->u.i |= 0xffff
199a0 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a  ffff80000000LL;.
199b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65  #endif.      pMe
199c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
199d0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
199e0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
199f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19a00 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
19a10 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
19a20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
19a30 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
19a40 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35  ENCE-OF: R-50385
19a50 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20  -09674 Value is 
19a60 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d  a big-endian 48-
19a70 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
19a80 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19a90 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19aa0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
19ab0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29  BYTE_UINT(buf+2)
19ac0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
19ad0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  )*TWO_BYTE_INT(b
19ae0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
19af0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19b00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19b10 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
19b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19b40 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
19b50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19b60 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
19b70 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
19b80 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  point */.      /
19b90 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61  * These use loca
19ba0 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20  l variables, so 
19bb0 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70  do them in a sep
19bc0 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20  arate routine.  
19bd0 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
19be0 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74  having to move t
19bf0 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72  he frame pointer
19c00 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19c10 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ase */.      ret
19c20 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75  urn serialGet(bu
19c30 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d  f,serial_type,pM
19c40 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  em);.    }.    c
19c50 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
19c60 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
19c70 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
19c80 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f  ger 1 */.      /
19c90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19ca0 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c  -12976-22893 Val
19cb0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
19cc0 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  r 0. */.      /*
19cd0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19ce0 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75  18143-12121 Valu
19cf0 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
19d00 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   1. */.      pMe
19d10 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
19d20 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
19d30 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19d40 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
19d50 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
19d60 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
19d70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19d80 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61  R-14606-31564 Va
19d90 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68  lue is a BLOB th
19da0 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62  at is (N-12)/2 b
19db0 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ytes in.      **
19dc0 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a   length..      *
19dd0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19de0 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c  -28401-00140 Val
19df0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  ue is a string i
19e00 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64  n the text encod
19e10 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ing and.      **
19e20 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20   (N-13)/2 bytes 
19e30 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20  in length. */.  
19e40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19e50 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b   u16 aFlag[] = {
19e60 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
19e70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  hem, MEM_Str|MEM
19e80 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20  _Ephem };.      
19e90 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
19ea0 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
19eb0 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m->n = (serial_t
19ec0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
19ed0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
19ee0 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
19ef0 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
19f00 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d  n pMem->n;.    }
19f10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19f20 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .}./*.** This ro
19f30 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
19f40 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
19f50 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
19f60 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
19f70 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
19f80 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
19f90 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
19fa0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
19fb0 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
19fc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
19fd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
19fe0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
19ff0 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
1a000 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
1a010 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
1a020 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
1a030 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
1a040 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
1a050 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
1a060 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
1a070 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
1a080 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
1a090 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
1a0a0 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
1a0b0 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
1a0c0 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
1a0d0 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
1a0e0 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
1a0f0 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
1a100 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1a110 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
1a120 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
1a130 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
1a140 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
1a150 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
1a160 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
1a170 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
1a180 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1a190 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1a1a0 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
1a1b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
1a1c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
1a1d0 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
1a1e0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
1a1f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a200 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a210 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1a220 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
1a230 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
1a260 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
1a270 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
1a2a0 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
1a2b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
1a2c0 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
1a2d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
1a2e0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
1a2f0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
1a300 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1a310 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1a320 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1a330 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1a340 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
1a350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a360 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1a370 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
1a380 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
1a390 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a3c0 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1a3d0 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
1a3e0 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
1a3f0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
1a400 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
1a410 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
1a420 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
1a430 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
1a440 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
1a450 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
1a460 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
1a470 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
1a480 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
1a490 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
1a4a0 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
1a4b0 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
1a4c0 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
1a4d0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
1a4e0 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
1a4f0 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
1a500 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1a510 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1a520 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1a530 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1a540 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
1a550 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
1a560 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
1a570 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
1a580 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
1a590 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
1a5a0 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
1a5b0 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
1a5c0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1a5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
1a5e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
1a5f0 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
1a600 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
1a610 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
1a620 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1a630 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1a640 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1a650 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1a660 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1a670 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1a680 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1a690 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1a6a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1a6b0 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1a6c0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1a6d0 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1a6e0 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1a6f0 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1a700 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1a710 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a720 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1a730 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1a740 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1a750 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1a760 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1a770 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1a780 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a790 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1a7a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a7b0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1a7c0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1a7d0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1a7e0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1a7f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a800 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1a810 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1a820 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1a830 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1a840 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1a850 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1a860 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1a870 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1a880 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1a890 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1a8a0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1a8b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1a8c0 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1a8d0 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1a8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1a900 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1a910 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1a920 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a940 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1a950 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1a960 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1a970 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1a980 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1a990 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1a9a0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1a9b0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1a9c0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1a9d0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1a9e0 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1a9f0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1aa00 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1aa10 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1aa20 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1aa30 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1aa40 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1aa50 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1aa60 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1aa70 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1aa80 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1aa90 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1aaa0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1aab0 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1aac0 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1aad0 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1aae0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1aaf0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
1ab00 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1ab10 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
1ab20 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1ab30 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
1ab40 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29  +;.    if( (++u)
1ab50 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72  >=p->nField ) br
1ab60 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  eak;.  }.  asser
1ab70 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1ab80 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
1ab90 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
1aba0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1abb0 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
1abc0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1abd0 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62  two index or tab
1abe0 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69  le record keys i
1abf0 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a  n the same way.*
1ac00 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  * as the sqlite3
1ac10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ac20 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c  e() routine. Unl
1ac30 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ike VdbeRecordCo
1ac40 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73  mpare(),.** this
1ac50 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1ac60 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61  alizes and compa
1ac70 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67  res values using
1ac80 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56   the.** sqlite3V
1ac90 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
1aca0 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nd sqlite3MemCom
1acb0 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73  pare() functions
1acc0 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  . It is used.** 
1acd0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1ace0 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
1acf0 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
1ad00 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73  zed code in.** s
1ad10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1ad20 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e  Compare() return
1ad30 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74  s results with t
1ad40 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69  hese two primiti
1ad50 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ves..**.** Retur
1ad60 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
1ad70 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
1ad80 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
1ad90 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c   to desiredResul
1ada0 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  t..** Return fal
1adb0 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  se if there is a
1adc0 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a   disagreement..*
1add0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1ade0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1adf0 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  bug(.  int nKey1
1ae00 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ae10 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1ae20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61   */.  const Unpa
1ae30 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1ae40 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79  y2, /* Right key
1ae50 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65   */.  int desire
1ae60 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  dResult         
1ae70 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61      /* Correct a
1ae80 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33  nswer */.){.  u3
1ae90 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1aea0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1aeb0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1aec0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1aed0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1aee0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1aef0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1af00 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
1af10 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1af20 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1af30 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
1af40 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
1af50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1af60 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
1af70 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1af80 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1af90 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1afa0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1afb0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
1afc0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
1afd0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1afe0 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1aff0 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
1b000 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d   1;.  mem1.enc =
1b010 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1b020 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1b030 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
1b040 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
1b050 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
1b060 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
1b070 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1b080 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
1b090 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1b0a0 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1b0b0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1b0c0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
1b0d0 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
1b0e0 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
1b0f0 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
1b100 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
1b110 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
1b120 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
1b130 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
1b140 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
1b150 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
1b160 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
1b170 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
1b180 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
1b190 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
1b1a0 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
1b1b0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
1b1c0 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
1b1d0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
1b1e0 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
1b1f0 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
1b200 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
1b210 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1b220 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
1b230 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
1b240 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
1b250 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
1b260 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
1b270 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
1b280 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
1b290 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
1b2a0 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
1b2b0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
1b2c0 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
1b2d0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
1b2e0 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
1b2f0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1b300 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64  dr1);.  if( szHd
1b310 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72  r1>98307 ) retur
1b320 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b330 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
1b340 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b350 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1b360 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1b370 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
1b380 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1b390 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1b3a0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1b3b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1b3c0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1b3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1b3e0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1b3f0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1b400 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1b410 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1b420 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1b430 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1b440 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1b450 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1b460 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1b470 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1b480 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1b490 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1b4a0 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1b4b0 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1b4c0 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1b4d0 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1b4e0 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1b4f0 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1b500 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1b510 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1b520 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1b530 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1b540 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1b550 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1b560 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1b570 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1b580 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1b590 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1b5a0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1b5b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1b5c0 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1b5d0 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1b5e0 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72  /.    if( d1+ser
1b5f0 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32  ial_type1+2>(u32
1b600 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
1b610 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  1+sqlite3VdbeSer
1b620 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1b630 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b  l_type1)>(u32)nK
1b640 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ey1 .    ){.    
1b650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1b660 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1b670 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
1b680 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
1b690 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1b6a0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b6b0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1b6c0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
1b6d0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
1b6e0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
1b6f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b700 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
1b710 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
1b720 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d  em[i], pKeyInfo-
1b730 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aColl[i]);.    
1b740 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1b750 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1b760 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1b770 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1b780 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66  elow */.      if
1b790 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1b7a0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1b7b0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20       rc = -rc;  
1b7c0 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
1b7d0 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f  sult for DESC so
1b7e0 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
1b7f0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1b800 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b  debugCompareEnd;
1b810 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
1b820 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73    }while( idx1<s
1b830 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1b840 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20  2->nField );..  
1b850 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1b860 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1b870 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1b880 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1b890 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1b8a0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1b8b0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1b8c0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1b8d0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1b8e0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1b8f0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1b900 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1b910 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
1b920 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1b930 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1b940 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1b950 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1b960 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1b970 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1b980 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1b990 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1b9a0 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1b9b0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1b9c0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1b9d0 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d  /.  rc = pPKey2-
1b9e0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65  >default_rc;..de
1b9f0 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20  bugCompareEnd:. 
1ba00 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1ba10 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29  lt==0 && rc==0 )
1ba20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1ba30 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30   desiredResult<0
1ba40 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72   && rc<0 ) retur
1ba50 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1ba60 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63  edResult>0 && rc
1ba70 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  >0 ) return 1;. 
1ba80 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1ba90 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1baa0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ( pKeyInfo->db->
1bab0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1bac0 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
1bad0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
1bae0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1baf0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1bb00 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1bb10 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73   (a.k.a. columns
1bb20 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  ) in the record 
1bb30 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79  given by.** pKey
1bb40 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69  ,nKey.  The veri
1bb50 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75  fy that this cou
1bb60 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  nt is less than 
1bb70 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1bb80 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62  ** limit given b
1bb90 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  y pKeyInfo->nFie
1bba0 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld + pKeyInfo->n
1bbb0 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  XField..**.** If
1bbc0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1bbd0 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
1bbe0 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d, it means that
1bbf0 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a   the high-speed.
1bc00 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  ** vdbeRecordCom
1bc10 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64  pareInt() and vd
1bc20 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1bc30 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73  tring() routines
1bc40 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
1bc50 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66  k correctly.  If
1bc60 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65   this assert() e
1bc70 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72  ver fires, it pr
1bc80 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20  obably means.** 
1bc90 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f  that the KeyInfo
1bca0 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e  .nField or KeyIn
1bcb0 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65  fo.nXField value
1bcc0 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a  s were computed.
1bcd0 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ** incorrectly..
1bce0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
1bcf0 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1bd00 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1bd10 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
1bd20 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1bd30 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74   /* The record t
1bd40 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63  o verify */ .  c
1bd50 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
1bd60 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20  eyInfo       /* 
1bd70 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74  Compare size wit
1bd80 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a  h this KeyInfo *
1bd90 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  /.){.  int nFiel
1bda0 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48  d = 0;.  u32 szH
1bdb0 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20  dr;.  u32 idx;. 
1bdc0 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20   u32 notUsed;.  
1bdd0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bde0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1bdf0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1be00 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43  *)pKey;..  if( C
1be10 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1be20 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56  rn;.  idx = getV
1be30 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1be40 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr);.  assert( 
1be50 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
1be60 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32  ert( szHdr<=(u32
1be70 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65  )nKey );.  while
1be80 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20  ( idx<szHdr ){. 
1be90 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1bea0 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20  int32(aKey+idx, 
1beb0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46  notUsed);.    nF
1bec0 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73  ield++;.  }.  as
1bed0 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20  sert( nField <= 
1bee0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1bef0 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
1bf00 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1bf10 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1bf20 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1bf30 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1bf40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1bf50 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1bf60 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1bf70 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1bf80 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1bf90 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1bfa0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1bfb0 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1bfc0 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1bfd0 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1bfe0 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1bff0 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1c000 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1c010 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1c020 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1c030 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1c040 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1c050 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1c060 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1c070 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1c080 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1c090 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1c0a0 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1c0b0 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1c0c0 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1c0d0 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1c100 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1c110 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1c120 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1c130 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1c140 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1c150 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1c160 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1c170 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1c180 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1c190 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1c1a0 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1c1b0 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1c1c0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1c1d0 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1c1e0 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1c1f0 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1c200 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c210 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1c220 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c  *v2;.    int n1,
1c230 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b   n2;.    Mem c1;
1c240 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1c250 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1c260 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1c270 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1c280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c290 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1c2a0 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1c2b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c2c0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1c2d0 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1c2e0 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1c2f0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1c300 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1c310 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1c320 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1c330 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1c340 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1c350 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20  l->enc);.    n1 
1c360 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31  = v1==0 ? 0 : c1
1c370 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  .n;.    v2 = sql
1c380 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1c390 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1c3a0 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  2, pColl->enc);.
1c3b0 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f      n2 = v2==0 ?
1c3c0 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72   0 : c2.n;.    r
1c3d0 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
1c3e0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31  pColl->pUser, n1
1c3f0 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20  , v1, n2, v2);. 
1c400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c410 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1c420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c430 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1c440 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1c450 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72   v2==0) && prcEr
1c460 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1c470 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d  return rc;.  }.}
1c490 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1c4a0 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75  two blobs.  Retu
1c4b0 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1c4c0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1c4d0 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
1c4e0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1c4f0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1c500 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1c510 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  d, respectively.
1c520 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20  .** If one blob 
1c530 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
1c540 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74  he other, then t
1c550 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68  he shorter is th
1c560 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e lessor..*/.sta
1c570 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
1c580 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1c590 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1c5a0 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1c5b0 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1c5c0 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31  t c = memcmp(pB1
1c5d0 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31  ->z, pB2->z, pB1
1c5e0 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32  ->n>pB2->n ? pB2
1c5f0 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20  ->n : pB1->n);. 
1c600 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20   if( c ) return 
1c610 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d  c;.  return pB1-
1c620 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a  >n - pB2->n;.}..
1c630 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1c640 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1c650 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1c660 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1c670 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1c680 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1c690 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1c6a0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1c6b0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1c6c0 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1c6d0 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1c6e0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1c6f0 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1c700 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1c710 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1c720 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1c730 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1c740 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1c750 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1c760 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1c770 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1c780 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1c790 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1c7a0 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1c7b0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1c7c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1c7d0 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1c7e0 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1c7f0 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1c800 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1c810 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1c820 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35  ( r>922337203685
1c830 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75  4775807.0 ) retu
1c840 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1c850 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1c860 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1c870 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20      if( i>y ){. 
1c880 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c       if( y==SMAL
1c890 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e  LEST_INT64 && r>
1c8a0 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  0.0 ) return -1;
1c8b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31  .      return +1
1c8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
1c8d0 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69  (double)i;.    i
1c8e0 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20  f( s<r ) return 
1c8f0 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20  -1;.    if( s>r 
1c900 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1c910 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1c920 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1c930 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1c940 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1c950 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1c960 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1c970 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1c980 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1c990 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1c9a0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1c9b0 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1c9c0 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1c9d0 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1c9e0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1c9f0 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1ca00 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1ca10 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1ca20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1ca30 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1ca40 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1ca50 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1ca60 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1ca70 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1ca80 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1ca90 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1caa0 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1cab0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1cac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1cad0 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1cae0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1caf0 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1cb00 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1cb10 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1cb20 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1cb30 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1cb40 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1cb50 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1cb60 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1cb70 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1cb80 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1cb90 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1cba0 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1cbb0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1cbc0 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1cbd0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1cbe0 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1cbf0 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1cc00 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1cc10 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1cc20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1cc30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1cc40 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1cc50 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1cc60 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f  .  /* At least o
1cc70 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61  ne of the two va
1cc80 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72  lues is a number
1cc90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1cca0 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1ccb0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1ccc0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1ccd0 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
1cce0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1ccf0 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
1cd00 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
1cd10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1cd20 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
1cd30 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
1cd40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1cd50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1cd60 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
1cd70 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1cd80 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
1cd90 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1cda0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1cdb0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
1cdc0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1cdd0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1cde0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1cdf0 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e    if( (f1&MEM_In
1ce00 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1ce10 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1ce20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1ce30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
1ce40 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1ce50 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
1ce60 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1ce70 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1ce80 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1ce90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1cea0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ceb0 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1cec0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1ced0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c       return -sql
1cee0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1cef0 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20  are(pMem2->u.i, 
1cf00 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem1->u.r);.   
1cf10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1cf30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1cf40 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20  eturn +1;.  }.. 
1cf50 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1cf60 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
1cf70 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
1cf80 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
1cf90 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1cfa0 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
1cfb0 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
1cfc0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
1cfd0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
1cfe0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1cff0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
1d000 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
1d010 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1d020 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1d030 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
1d040 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1d050 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1d060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1d070 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1d080 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20  pMem2->enc );.  
1d090 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1d0a0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d0b0 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1d0c0 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1d0d0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1d0e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d0f0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1d100 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1d110 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1d120 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1d130 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1d140 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1d150 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1d160 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d170 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1d180 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1d190 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1d1a0 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1d1b0 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1d1c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d1d0 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1d1e0 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1d1f0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1d200 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1d210 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1d220 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1d230 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1d240 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1d250 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1d260 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1d270 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1d280 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1d290 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1d2a0 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1d2b0 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1d2c0 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1d2d0 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1d2e0 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1d2f0 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1d300 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1d310 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1d320 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1d330 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1d340 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1d350 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1d360 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1d370 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1d380 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1d390 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1d3a0 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1d3b0 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1d3c0 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1d3d0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1d3e0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1d3f0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1d400 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1d410 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1d420 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1d430 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1d440 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1d450 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1d460 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1d470 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1d480 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1d490 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1d4a0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1d4b0 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1d4c0 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1d4d0 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1d4e0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1d4f0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1d500 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1d510 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1d520 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1d530 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d540 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d550 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1d560 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1d570 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d580 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1d5a0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1d5b0 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1d5c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d5d0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d5e0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1d5f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d600 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1d610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d620 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d630 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1d640 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d650 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1d660 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1d670 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1d680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d690 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d6a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1d6b0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d6c0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1d6d0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1d6e0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1d6f0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1d700 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1d710 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1d720 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d730 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d740 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1d750 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1d760 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1d770 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d780 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1d790 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1d7a0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1d7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d7c0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1d7d0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1d7e0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1d7f0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1d800 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1d810 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1d820 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1d830 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1d840 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1d850 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1d860 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1d870 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1d880 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1d890 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1d8a0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1d8b0 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1d8c0 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1d8d0 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1d8e0 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1d8f0 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1d900 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1d910 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1d920 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1d930 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1d940 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1d950 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1d960 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1d970 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1d980 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1d990 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1d9a0 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1d9b0 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1d9c0 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1d9d0 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1d9e0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1d9f0 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1da00 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1da10 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1da20 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1da30 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1da40 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1da50 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1da60 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1da70 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1da80 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1da90 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1daa0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dab0 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1dac0 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1dad0 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1dae0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1daf0 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1db00 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1db10 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1db20 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1db30 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1db40 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1db50 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1db60 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1db70 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1db80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1db90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1dba0 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1dbb0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1dbc0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1dbd0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1dbe0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1dbf0 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1dc00 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1dc10 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc30 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1dc40 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1dc50 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1dc80 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1dc90 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1dca0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1dcd0 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1dce0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1dcf0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd10 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1dd20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1dd30 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1dd60 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1dd70 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1dd80 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dda0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1ddb0 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1ddc0 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1ddd0 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1dde0 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1ddf0 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1de00 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1de10 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1de20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1de30 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1de40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1de50 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1de60 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1de70 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1de80 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1de90 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1dea0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1deb0 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1dec0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1ded0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1dee0 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1def0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1df00 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1df10 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1df20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1df30 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1df40 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1df50 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1df60 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1df70 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1df80 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1df90 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1dfa0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1dfb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1dfc0 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1dfd0 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1dfe0 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1dff0 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1e000 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1e010 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1e020 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1e030 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1e040 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1e050 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1e060 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1e070 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1e080 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1e090 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e0a0 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1e0b0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1e0c0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1e0d0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1e0e0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1e0f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1e100 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e110 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65  nfo->nField+pPKe
1e120 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1e130 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1e140 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1e150 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1e160 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e170 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1e180 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1e190 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e1a0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1e1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1e1c0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1e1d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1e1e0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1e1f0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1e200 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1e210 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1e220 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1e230 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1e240 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1e250 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1e260 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e270 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e280 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1e290 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
1e2a0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e2b0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e2c0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1e2d0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e2e0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e2f0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1e300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1e310 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1e320 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1e330 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1e340 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
1e350 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1e360 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
1e370 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1e380 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1e390 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1e3a0 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1e3b0 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1e3c0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1e3d0 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1e3e0 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1e3f0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e400 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e410 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1e420 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e430 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e440 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e450 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e460 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1e470 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e480 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1e490 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1e4a0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1e4b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e4c0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1e4d0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1e4e0 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
1e4f0 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
1e500 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
1e510 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
1e520 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
1e530 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
1e540 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
1e550 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
1e560 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
1e570 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
1e580 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
1e590 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
1e5a0 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
1e5b0 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
1e5c0 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
1e5d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
1e5e0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1e5f0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e600 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1e610 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e630 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e640 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e650 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e660 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1e670 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e690 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
1e6a0 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1e6b0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e6c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e6d0 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
1e6e0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1e6f0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
1e730 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
1e740 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
1e750 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e760 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e770 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1e780 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1e790 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e7a0 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1e7b0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1e7c0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1e7d0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1e7e0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1e7f0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1e800 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e810 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1e820 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e830 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1e840 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1e850 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e860 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1e870 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1e880 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1e890 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1e8a0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1e8b0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1e8c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1e8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1e8e0 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1e8f0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1e900 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1e910 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1e920 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1e930 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1e940 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1e950 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e960 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1e970 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e980 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1e990 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1e9a0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1e9b0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1e9c0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1e9d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1e9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1e9f0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1ea00 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1ea10 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1ea20 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1ea30 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1ea40 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1ea50 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1ea60 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1ea80 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1ea90 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1eaa0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1eab0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1eac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ead0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1eae0 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1eaf0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1eb00 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1eb10 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1eb20 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1eb30 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1eb40 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1eb50 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1eb60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1eb70 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1eb80 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1eb90 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1eba0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1ebb0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1ebc0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1ebd0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1ebe0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1ebf0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1ec00 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ec10 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1ec20 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1ec30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ec40 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1ec50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1ec60 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1ec70 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1ec80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ec90 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1eca0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ecb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ecc0 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1ecd0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ece0 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1ecf0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1ed00 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1ed10 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ed20 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1ed30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ed40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1ed50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed60 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ed70 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1ed80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1ed90 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1eda0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1edb0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1edc0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1edd0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1ede0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1edf0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1ee00 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1ee10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ee20 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1ee30 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1ee40 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1ee50 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1ee60 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1ee70 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1ee80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1ee90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1eea0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1eeb0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1eec0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1eed0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1eee0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1eef0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1ef00 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1ef10 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1ef20 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1ef30 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1ef40 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1ef50 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1ef60 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1ef70 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1ef80 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1ef90 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1efa0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1efb0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1efc0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1efd0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1efe0 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1eff0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1f000 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1f010 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1f020 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1f030 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1f040 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1f050 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1f060 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1f070 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1f080 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1f090 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1f0a0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1f0b0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1f0c0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1f0d0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1f0e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1f0f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f100 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1f110 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1f120 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1f130 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1f140 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1f150 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1f160 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1f170 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1f180 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1f190 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1f1a0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1f1b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1f1c0 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1f1d0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1f1e0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1f1f0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f200 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1f210 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1f220 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1f230 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1f240 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
1f250 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
1f260 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f270 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1f280 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f290 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1f2a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f2b0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1f2c0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1f2d0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1f2e0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1f2f0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1f300 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1f310 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1f320 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1f330 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
1f340 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f350 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1f360 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1f370 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f380 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1f390 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1f3a0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1f3b0 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1f3c0 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1f3d0 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1f3e0 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1f3f0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1f400 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1f410 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1f420 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1f430 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1f440 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1f450 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1f460 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1f470 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1f480 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1f490 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1f4a0 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1f4b0 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1f4c0 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1f4d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1f4e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1f4f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1f500 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1f510 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1f520 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1f530 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1f540 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1f550 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1f560 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1f570 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1f580 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1f590 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1f5a0 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1f5b0 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1f5c0 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1f5d0 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1f5e0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1f5f0 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1f600 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1f610 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1f620 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1f630 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1f640 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
1f650 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
1f660 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
1f670 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
1f680 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1f690 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
1f6a0 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
1f6b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f6c0 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
1f6d0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f6e0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f6f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f700 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1f710 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1f720 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f730 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
1f740 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f750 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f760 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f770 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f780 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1f790 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f7a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f7b0 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1f7c0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f7d0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f7e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f7f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1f800 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1f810 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f820 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1f830 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f840 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
1f850 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
1f860 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f870 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f880 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1f890 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1f8a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f8b0 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
1f8c0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1f8d0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1f8e0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1f8f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f900 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f910 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f920 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1f930 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
1f940 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f950 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
1f960 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f970 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1f980 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1f990 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1f9a0 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
1f9b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f9c0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1f9d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f9e0 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
1f9f0 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
1fa00 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
1fa10 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
1fa20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1fa30 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1fa40 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
1fa50 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
1fa60 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
1fa70 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
1fa80 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
1fa90 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
1faa0 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
1fab0 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
1fac0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
1fad0 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
1fae0 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
1faf0 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
1fb00 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
1fb10 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
1fb20 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
1fb30 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
1fb40 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
1fb50 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
1fb60 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
1fb70 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
1fb80 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
1fb90 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
1fba0 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
1fbb0 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
1fbc0 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
1fbd0 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
1fbe0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1fbf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fc00 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fc10 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
1fc20 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1fc30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1fc40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1fc50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1fc60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1fc70 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1fc80 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1fc90 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1fca0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1fcb0 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1fcc0 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1fcd0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1fce0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1fcf0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1fd00 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1fd10 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1fd20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1fd30 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1fd40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fd50 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1fd60 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fd70 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1fd80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1fd90 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1fda0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1fdb0 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1fdc0 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1fdd0 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1fde0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1fdf0 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1fe00 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1fe10 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1fe20 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
1fe30 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
1fe40 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1fe50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1fe60 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1fe70 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1fe80 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1fe90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1fea0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1feb0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1fec0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fed0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1fee0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1fef0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1ff00 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
1ff10 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
1ff20 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
1ff30 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1ff40 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
1ff50 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
1ff60 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1ff70 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
1ff80 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1ff90 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1ffa0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
1ffb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1ffc0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1ffd0 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
1ffe0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1fff0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
20000 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
20010 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
20020 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
20030 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
20040 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
20050 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
20060 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
20070 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
20080 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
20090 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
200a0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
200b0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
200c0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
200d0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
200e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
200f0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20100 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
20110 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
20120 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
20130 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20140 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
20150 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
20160 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
20170 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
20180 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
20190 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
201a0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
201b0 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
201c0 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
201d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
201e0 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
201f0 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
20200 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
20210 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
20220 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
20230 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
20240 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
20250 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
20260 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20280 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20290 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
202a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
202b0 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
202c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
202d0 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
202e0 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
202f0 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
20300 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
20310 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
20320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
20330 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
20340 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
20350 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
20360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
20370 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
20380 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20390 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
203a0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
203b0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
203c0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
203d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
203e0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
203f0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
20400 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
20410 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
20420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
20430 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
20440 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
20450 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
20460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20470 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20490 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
204a0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
204b0 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
204c0 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
204d0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
204e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
204f0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20500 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
20510 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
20520 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
20530 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
20540 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20550 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
20560 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
20570 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
20580 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20590 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
205a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
205b0 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
205c0 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
205d0 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
205e0 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
205f0 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
20600 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
20610 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
20620 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
20630 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
20640 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
20650 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
20660 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
20670 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20680 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
20690 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
206a0 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
206b0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
206c0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
206d0 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
206e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
206f0 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
20700 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20710 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
20720 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
20730 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
20740 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
20750 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
20760 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
20770 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
20780 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
20790 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
207a0 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
207b0 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
207c0 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
207d0 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
207e0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
207f0 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
20800 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
20810 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
20820 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
20830 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
20840 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20850 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
20860 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
20870 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
20880 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
20890 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
208a0 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
208b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
208c0 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
208d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
208e0 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
208f0 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
20900 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
20910 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
20920 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
20930 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
20940 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
20950 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
20960 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
20970 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
20980 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
20990 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
209a0 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
209b0 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
209c0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
209d0 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
209e0 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
209f0 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
20a00 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
20a10 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
20a20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
20a30 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
20a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20a50 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
20a60 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
20a70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
20a80 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
20a90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20aa0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20ab0 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
20ac0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20ad0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
20ae0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20af0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
20b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20b10 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
20b20 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
20b30 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
20b40 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
20b50 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
20b60 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
20b70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20b80 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
20b90 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20ba0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20bb0 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
20bc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
20bd0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20be0 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
20bf0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
20c00 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
20c10 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
20c20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
20c30 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
20c40 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
20c50 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
20c60 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
20c70 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
20c80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20c90 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
20ca0 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
20cb0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
20cc0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
20cd0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
20ce0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
20cf0 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
20d00 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
20d10 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
20d20 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
20d30 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
20d40 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
20d50 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
20d60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
20d70 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
20d80 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
20d90 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
20da0 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
20db0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
20dc0 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
20dd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20de0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
20df0 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
20e00 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
20e10 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
20e20 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
20e30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20e40 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
20e50 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
20e60 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
20e70 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
20e80 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
20e90 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
20ea0 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
20eb0 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
20ec0 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
20ed0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
20ee0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
20ef0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
20f00 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
20f10 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20f20 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
20f30 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
20f40 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
20f50 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
20f60 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
20f70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20f80 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
20f90 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
20fa0 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
20fb0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
20fc0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
20fd0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
20fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
20ff0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
21000 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
21010 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
21020 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
21030 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
21040 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
21050 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
21060 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
21070 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
21080 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21090 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
210a0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
210b0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
210c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
210d0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
210e0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
210f0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
21120 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
21130 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
21140 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
21150 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
21160 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
21170 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21180 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
21190 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
211a0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
211b0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
211c0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
211d0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
211e0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
211f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
21200 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
21210 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
21220 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
21230 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
21240 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
21250 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
21260 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
21270 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
21280 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
21290 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
212a0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
212b0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
212c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
212d0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
212e0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
212f0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
21300 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21310 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
21320 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
21330 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21340 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
21350 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21360 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
21370 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21380 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
21390 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
213a0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
213b0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
213c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
213d0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
213e0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
213f0 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
21400 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
21410 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
21420 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
21430 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
21440 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
21450 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
21460 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
21470 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
21480 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
21490 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
214a0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
214b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
214c0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
214d0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
214e0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
214f0 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
21500 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
21510 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
21520 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
21530 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
21540 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
21550 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
21560 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21570 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
21580 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
21590 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
215a0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
215b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
215c0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
215d0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
215e0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
215f0 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
21600 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
21610 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
21620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21630 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
21640 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
21650 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
21660 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
21670 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
21680 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
21690 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
216a0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
216b0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
216c0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
216d0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
216e0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
216f0 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
21700 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
21710 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
21720 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
21730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21740 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
21750 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
21760 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
21770 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
21780 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
21790 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
217a0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
217b0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
217c0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
217d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
217e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
217f0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
21800 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
21810 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
21820 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
21830 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
21840 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
21850 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
21860 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
21870 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
21880 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
21890 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
218a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
218b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
218c0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
218d0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
218e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
218f0 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
21900 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
21910 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
21920 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
21930 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
21940 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
21950 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21970 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
21980 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
21990 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
219a0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
219b0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
219c0 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
219d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
219e0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
219f0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
21a00 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
21a10 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
21a20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21a30 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
21a40 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
21a50 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
21a60 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
21a70 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
21a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21a90 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
21aa0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
21ab0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
21ac0 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
21ad0 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
21ae0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
21af0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
21b00 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
21b10 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
21b20 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
21b30 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
21b40 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
21b50 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
21b60 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
21b70 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
21b80 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
21b90 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
21ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21bb0 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
21bc0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
21bd0 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
21be0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
21bf0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
21c00 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
21c10 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
21c20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
21c30 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
21c40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21c50 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
21c60 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
21c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21c80 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21cb0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
21cc0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
21cd0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
21ce0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
21cf0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
21d00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21d10 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
21d20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
21d30 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
21d40 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
21d50 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
21d60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21d70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
21d80 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
21d90 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
21da0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
21db0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
21dc0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
21dd0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
21de0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
21df0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
21e00 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
21e10 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
21e20 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
21e30 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
21e40 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
21e50 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
21e60 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
21e70 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
21e80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21e90 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
21ea0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
21eb0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
21ec0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
21ed0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
21ee0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
21ef0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
21f00 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
21f10 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
21f20 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
21f30 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
21f40 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
21f50 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
21f60 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
21f70 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
21f80 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
21f90 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
21fa0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
21fb0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
21fc0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
21fd0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
21fe0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
21ff0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22000 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22010 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22020 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
22030 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
22040 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
22050 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
22060 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22070 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22090 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
220a0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
220b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
220c0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
220d0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
220e0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
220f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22100 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22110 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22120 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
22130 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
22140 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
22150 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
22160 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22170 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22180 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22190 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
221a0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
221b0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
221c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
221d0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
221e0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
221f0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22200 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22210 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22220 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
22230 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
22240 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
22250 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
22260 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
22270 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
22280 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22290 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
222a0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
222b0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
222c0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
222d0 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
222e0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
222f0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22300 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22310 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
22320 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
22330 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
22340 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22350 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
22360 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
22370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22380 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22390 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
223a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
223b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
223c0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
223d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
223e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
223f0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
22400 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
22410 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
22420 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
22430 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
22440 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
22450 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
22460 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
22470 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
22480 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
22490 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
224a0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
224b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
224c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
224d0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
224e0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
224f0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
22500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
22510 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
22520 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
22530 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
22540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
22550 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
22560 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
22570 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
22580 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
22590 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
225a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
225b0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
225c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
225d0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
225e0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
225f0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22600 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22610 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
22620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
22630 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
22640 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
22650 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
22660 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
22670 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
22680 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
22690 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
226a0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
226b0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
226c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
226d0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
226e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
226f0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
22700 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22710 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
22720 41 42 4c 45 20 2a 2f 0a                          ABLE */.