/ Hex Artifact Content
Login

Artifact 33e2973796a016956887466c2b3a1991eab3af6c:


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 69 6e 74 20 73  perand..*/.int s
1190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
11b0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
11c0: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74  , int p3){.  int
11d0: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
11e0: 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70  p;..  i = p->nOp
11f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1200: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1210: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1220: 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78  t( op>0 && op<0x
1230: 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ff );.  if( p->p
1240: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  Parse->nOpAlloc<
1250: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
1260: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20  owOpArray(p, 1) 
1270: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1280: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
1290: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
12a0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
12b0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
12c0: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
12d0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
12e0: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
12f0: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1300: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1310: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
1320: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1330: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1340: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1350: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1360: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
1370: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1380: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
13b0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
13c0: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
13d0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
13e0: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
13f0: 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e  k=0; jj<SQLITE_N
1400: 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29  _COLCACHE; jj++)
1410: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
1420: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1430: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1440: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  + jj;.      if( 
1450: 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  x->iLevel>pParse
1460: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c  ->iCacheLevel ||
1470: 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f   x->iReg==0 ) co
1480: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72  ntinue;.      pr
1490: 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64  intf(" r[%d]={%d
14a0: 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20  :%d}", x->iReg, 
14b0: 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43  x->iTable, x->iC
14c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b  olumn);.      kk
14d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
14e0: 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c  ( kk ) printf("\
14f0: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1500: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1510: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1520: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1530: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1540: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1550: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1560: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1570: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1580: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1590: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
15a0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
15b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
15c0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
15d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
15e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
15f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1600: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1610: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1620: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1630: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1640: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1650: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1660: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1670: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1680: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1690: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
16a0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
16b0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
16c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
16e0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
16f0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1700: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1710: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1720: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1730: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1740: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1750: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1770: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1780: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1790: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17a0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
17b0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
17c0: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
17d0: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
17e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
17f0: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1800: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1810: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1820: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1830: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1840: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1850: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1860: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1870: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1880: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1890: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
18a0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
18b0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
18c0: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
18d0: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
18e0: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
18f0: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1900: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1910: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1920: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1930: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1940: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1950: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1960: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1970: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1980: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1990: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
19a0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
19b0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
19c0: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
19d0: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
19e0: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
19f0: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1a00: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1a10: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  integer..*/.void
1a20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
1a30: 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69  iLoad(Vdbe *p, i
1a40: 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20  nt iDest, const 
1a50: 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e  char *zTypes, ..
1a60: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1a70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
1a80: 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  r c;.  va_start(
1a90: 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66  ap, zTypes);.  f
1aa0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79  or(i=0; (c = zTy
1ab0: 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  pes[i])!=0; i++)
1ac0: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27  {.    if( c=='s'
1ad0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1ae0: 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67  char *z = va_arg
1af0: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1b00: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
1b10: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1b20: 64 64 4f 70 32 28 70 2c 20 7a 3d 3d 30 20 3f 20  ddOp2(p, z==0 ? 
1b30: 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72  OP_Null : OP_Str
1b40: 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b  ing8, 0, iDest++
1b50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29  );.      if( z )
1b60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b70: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 2c  geP4(p, addr, z,
1b80: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1b90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
1ba0: 3d 27 69 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='i' );.      sq
1bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bc0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
1bd0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
1be0: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 7d 0a  iDest++);.    }.
1bf0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
1c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1c10: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1c20: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1c30: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1c40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c50: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1c60: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1c70: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1c80: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1c90: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1ca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1cb0: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1cc0: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1cd0: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1ce0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d00: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1d10: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d30: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1d50: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1d60: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1d70: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1d80: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1d90: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1da0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1db0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1dc0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1de0: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1df0: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1e00: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1e10: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1e20: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1e30: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1e40: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1e50: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1e60: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1e70: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1e80: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1e90: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1ea0: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1eb0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
1ec0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1ed0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
1ee0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
1ef0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1f00: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f20: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1f30: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1f50: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1f60: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
1f70: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1f80: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1f90: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1fa0: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1fb0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
1fc0: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
1fd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
1fe0: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b  e3VdbeDb(p), 8);
1ff0: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20  .  if( p4copy ) 
2000: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a  memcpy(p4copy, z
2010: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e  P4, 8);.  return
2020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2030: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p4(p, op, p1, p2
2040: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34  , p3, p4copy, p4
2050: 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
2060: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53  Add an OP_ParseS
2070: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54  chema opcode.  T
2080: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62  his routine is b
2090: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a  roken out from.*
20a0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
20b0: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e  Op4() since it n
20c0: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65  eeds to also nee
20d0: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62  ds to mark all b
20e0: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69  trees.** as havi
20f0: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a  ng been used..**
2100: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73  .** The zWhere s
2110: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20  tring must have 
2120: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2130: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
2140: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  c()..** This rou
2150: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  tine will take o
2160: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
2170: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
2180: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2190: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
21a0: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  emaOp(Vdbe *p, i
21b0: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57  nt iDb, char *zW
21c0: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  here){.  int j;.
21d0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
21e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
21f0: 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
2200: 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b 0a 20 20  , iDb, 0, 0);.  
2210: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2220: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 57 68  eP4(p, addr, zWh
2230: 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ere, P4_DYNAMIC)
2240: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
2250: 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20  ->db->nDb; j++) 
2260: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
2270: 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f  tree(p, j);.}../
2280: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
2290: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
22a0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
22b0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
22c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
22d0: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
22e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22f0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
2300: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
2310: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2320: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2330: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2340: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
2350: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
2360: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2380: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
2390: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
23a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
23b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
23c0: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
23d0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
23e0: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
23f0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
2400: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2410: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
2420: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
2430: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
2440: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
2450: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
2460: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
2470: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2480: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2490: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
24a0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
24b0: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
24c0: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
24d0: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
24e0: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
24f0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
2500: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
2510: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
2520: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
2530: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
2540: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
2550: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
2560: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
2570: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
2580: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
2590: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
25a0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
25b0: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
25c0: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
25d0: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
25e0: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
25f0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
2600: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
2610: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
2620: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
2630: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
2640: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
2650: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
2660: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
2670: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
2680: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
2690: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
26a0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
26b0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
26c0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
26d0: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
26e0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
26f0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
2700: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2710: 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72  (Vdbe *v){.  Par
2720: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2730: 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  e;.  int i = p->
2740: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
2750: 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( v->magic==VD
2760: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2770: 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31  .  if( (i & (i-1
2780: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))==0 ){.    p->
2790: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  aLabel = sqlite3
27a0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
27b0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
27c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31            (i*2+1
27f0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )*sizeof(p->aLab
2800: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
2810: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
2820: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
2830: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
2840: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
2850: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
2860: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
2870: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2880: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2890: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
28a0: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
28b0: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
28c0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
28d0: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
28e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
28f0: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
2900: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2910: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
2920: 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *v, int x){.  
2930: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
2940: 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20  arse;.  int j = 
2950: 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20  -1-x;.  assert( 
2960: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2970: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2980: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62  ssert( j<p->nLab
2990: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
29a0: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  j>=0 );.  if( p-
29b0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
29c0: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
29d0: 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  >nOp;.  }.  p->i
29e0: 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70  FixedOp = v->nOp
29f0: 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   - 1;.}../*.** M
2a00: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2a10: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2a20: 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d  y be run one tim
2a30: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2a40: 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63  e3VdbeRunOnlyOnc
2a50: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
2a60: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31  >runOnlyOnce = 1
2a70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2a80: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
2a90: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2aa0: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
2ab0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2ac0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
2ad0: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
2ae0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2af0: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
2b00: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
2b10: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
2b20: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
2b30: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
2b40: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
2b50: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
2b60: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
2b70: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
2b80: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
2b90: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
2ba0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
2bb0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
2bc0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2bd0: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
2be0: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
2c10: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
2c20: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2c30: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2c40: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
2c50: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
2c60: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
2c70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c80: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2c90: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
2ca0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
2cb0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
2cc0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
2cd0: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
2d00: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2d10: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
2d20: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
2d30: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
2d40: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
2d50: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
2d60: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
2d70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d80: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
2d90: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
2da0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2db0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2dc0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2dd0: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
2de0: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2e00: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
2e10: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
2e20: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
2e30: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
2e40: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
2e50: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
2e60: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
2e70: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
2e80: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
2e90: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
2ea0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
2eb0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
2ec0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
2ed0: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
2ee0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
2ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
2f00: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
2f10: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
2f20: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
2f30: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
2f40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2f50: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
2f60: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
2f70: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
2f80: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
2f90: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
2fa0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
2fb0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
2fc0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
2fd0: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
2fe0: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
2ff0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
3000: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
3010: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3020: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3030: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3040: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3050: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3060: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
3070: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
3080: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30a0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
30b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
30c0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
30d0: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
30e0: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
30f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3100: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
3110: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3120: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3130: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3140: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3150: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3160: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
3170: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3180: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3190: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
31a0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
31b0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
31c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
31d0: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
31e0: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
31f0: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
3200: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
3210: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3220: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3230: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3240: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3250: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3260: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
3270: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
3280: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
3290: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
32a0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
32b0: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
32c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
32d0: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
32e0: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
32f0: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
3300: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3310: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3320: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3330: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3340: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3350: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3360: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
3370: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
3380: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
3390: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
33a0: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  *  OP_CreateTabl
33b0: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  e and OP_InitCor
33c0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41  outine (for CREA
33d0: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45  TE TABLE AS SELE
33e0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
33f0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
3400: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
3410: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
3420: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
3430: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
3440: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3450: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
3460: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
3470: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
3480: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
3490: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
34a0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
34b0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
34c0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
34d0: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
34e0: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
34f0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
3500: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
3510: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
3520: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
3530: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
3540: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
3550: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
3560: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
3570: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
3580: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  rt = 0;.  int ha
3590: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  sFkCounter = 0;.
35a0: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54    int hasCreateT
35b0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  able = 0;.  int 
35c0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
35d0: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
35e0: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
35f0: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
3600: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
3610: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
3620: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
3630: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3640: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
3650: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
3660: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
3670: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3680: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
3690: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
36a0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
36b0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
36c0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
36d0: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
36e0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
36f0: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
3700: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
3710: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
3720: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
3730: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
3740: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
3750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3760: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3770: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20  P_CreateTable ) 
3780: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3790: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
37a0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
37b0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
37c0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
37d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37e0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
37f0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3800: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3810: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3820: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3830: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3840: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3850: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3860: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
3870: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
3880: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
3890: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
38a0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
38b0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
38c0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
38d0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
38e0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
38f0: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3900: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3910: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3920: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3930: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3940: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3950: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3960: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3970: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3980: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3990: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
39a0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
39b0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
39c0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
39d0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
39e0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3a00: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3a10: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3a20: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3a30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3a40: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3a50: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3a60: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3a70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a80: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3a90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3aa0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3ab0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3ac0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3ad0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3ae0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
3af0: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
3b00: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
3b10: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
3b20: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
3b30: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
3b40: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
3b50: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
3b60: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
3b70: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
3b80: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3b90: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
3ba0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
3bb0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
3bc0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
3bd0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
3be0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
3bf0: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
3c00: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
3c10: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
3c20: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
3c30: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
3c40: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
3c50: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
3c60: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
3c70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3c80: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
3c90: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
3ca0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
3cb0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
3cc0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3cd0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
3ce0: 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  abels..*/.static
3cf0: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
3d00: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
3d10: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
3d20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3d30: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d  t nMaxArgs = *pM
3d40: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70  axFuncArgs;.  Op
3d50: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a   *pOp;.  Parse *
3d60: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
3d70: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  se;.  int *aLabe
3d80: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  l = pParse->aLab
3d90: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
3da0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
3db0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
3dc0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
3dd0: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
3de0: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
3df0: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
3e00: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
3e10: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
3e20: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
3e30: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
3e40: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
3e50: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
3e60: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
3e70: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
3e80: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
3e90: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
3ea0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3eb0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3ec0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
3ed0: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
3ee0: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
3ef0: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
3f00: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
3f10: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
3f20: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
3f30: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
3f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f50: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
3f60: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
3f70: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
3f80: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
3f90: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
3fa0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
3fb0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
3fc0: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
3fd0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
3fe0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
3ff0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4000: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
4010: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4020: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
4030: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
4040: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4050: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
4060: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
4070: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
4080: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4090: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
40a0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
40b0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
40c0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
40d0: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
40e0: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
40f0: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
4100: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
4110: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
4120: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
4130: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4140: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
4150: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
4160: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
4170: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
4180: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
4190: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
41a0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
41b0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
41c0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
41d0: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
41e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
41f0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
4200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4210: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
4220: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
4230: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
4240: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
4250: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
4260: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
4270: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
4280: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
4290: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
42a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
42b0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
42c0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
42d0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
42e0: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
42f0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
4300: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4310: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4320: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
4330: 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e  Op->p2<pParse->n
4340: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
4350: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
4360: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
4370: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4380: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
4390: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
43a0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
43b0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
43c0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
43d0: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
43e0: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
43f0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
4400: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
4410: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
4420: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
4430: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
4440: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
4450: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
4460: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
4470: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4480: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
4490: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
44a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
44b0: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
44c0: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
44d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
44e0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
44f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
4500: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
4510: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
4520: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
4530: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4540: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
4550: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
4560: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
4570: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
4580: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
4590: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
45a0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
45b0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
45c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
45d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
45e0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
45f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4600: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
4610: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
4620: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
4630: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
4640: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
4650: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
4660: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
4670: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4680: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
4690: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
46a0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
46b0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
46c0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
46d0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
46e0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
46f0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
4700: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
4710: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
4720: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
4730: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
4740: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
4750: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
4760: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
4770: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
4780: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
4790: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
47a0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
47b0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
47c0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
47d0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
47e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
47f0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
4800: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
4810: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
4820: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
4830: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
4840: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
4850: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
4860: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
4870: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
48a0: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
48b0: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69  st const *aOp, i
48c0: 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69  nt iLineno){.  i
48d0: 6e 74 20 61 64 64 72 2c 20 69 3b 0a 20 20 56 64  nt addr, i;.  Vd
48e0: 62 65 4f 70 20 2a 70 4f 75 74 3b 0a 20 20 61 73  beOp *pOut;.  as
48f0: 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20  sert( nOp>0 );. 
4900: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4910: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4920: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
4930: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50  Op + nOp > p->pP
4940: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26  arse->nOpAlloc &
4950: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  & growOpArray(p,
4960: 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74   nOp) ){.    ret
4970: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
4980: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 4f  r = p->nOp;.  pO
4990: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  ut = &p->aOp[add
49a0: 72 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r];.  for(i=0; i
49b0: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b  <nOp; i++, aOp++
49c0: 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 69  , pOut++){.    i
49d0: 6e 74 20 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  nt p2 = aOp->p2;
49e0: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
49f0: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
4a00: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
4a10: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 66 28  aOp->p1;.    if(
4a20: 20 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61   p2<0 ){.      a
4a30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 70  ssert( sqlite3Op
4a40: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
4a50: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
4a60: 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20  LG_JUMP );.     
4a70: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72   pOut->p2 = addr
4a80: 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20   + ADDR(p2);.   
4a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
4aa0: 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20  ut->p2 = p2;.   
4ab0: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20   }.    pOut->p3 
4ac0: 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70  = aOp->p3;.    p
4ad0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
4ae0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f  _NOTUSED;.    pO
4af0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
4b00: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
4b10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4b20: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
4b30: 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e  MENTS.    pOut->
4b40: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
4b50: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4b60: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
4b70: 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c  .    pOut->iSrcL
4b80: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
4b90: 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64  .#else.    (void
4ba0: 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66  )iLineno;.#endif
4bb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4bc0: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
4bd0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
4be0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
4bf0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
4c00: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
4c10: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
4c20: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 7d  [i+addr]);.    }
4c30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d  .#endif.  }.  p-
4c40: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72  >nOp += nOp;.  r
4c50: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
4c60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4c70: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
4c80: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
4c90: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
4ca0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
4cb0: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
4cc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
4cd0: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
4ce0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
4cf0: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
4d00: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d20: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
4d30: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
4d40: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d60: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
4d70: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
4d80: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
4d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4da0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4db0: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
4dc0: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
4dd0: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
4de0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4df0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
4e00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
4e10: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e30: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
4e40: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
4e50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4e60: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
4e70: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4e80: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
4e90: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
4ea0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
4eb0: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
4ec0: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
4ed0: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
4ee0: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
4ef0: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
4f00: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
4f10: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
4f20: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
4f30: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
4f40: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
4f50: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
4f60: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
4f70: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
4f80: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
4f90: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
4fa0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
4fb0: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
4fc0: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
4fd0: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
4fe0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
4ff0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
5000: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
5010: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
5020: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5030: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5040: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
5050: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
5060: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
5070: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
5080: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5090: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
50a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
50b0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
50c0: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
50d0: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
50e0: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
50f0: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
5100: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
5110: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5120: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
5130: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
5140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5150: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
5160: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
5170: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
5180: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5190: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
51a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
51b0: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
51c0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
51d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
51e0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
51f0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5200: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5210: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
5220: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5230: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
5240: 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20 20  e *p, u8 p5){.  
5250: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5260: 28 70 2c 2d 31 29 2d 3e 70 35 20 3d 20 70 35 3b  (p,-1)->p5 = p5;
5270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
5280: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
5290: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
52a0: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
52b0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
52c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
52d0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
52e0: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
52f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5300: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
5310: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 70  , int addr){.  p
5320: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
5330: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
5340: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
5350: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
5360: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
5370: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
5380: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
5390: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
53a0: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
53b0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
53c0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
53d0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
53e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
53f0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
5400: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
5410: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
5420: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
5430: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
5440: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5450: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
5460: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
5470: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
5480: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
5490: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
54a0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
54b0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
54c0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
54d0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
54e0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
54f0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
5500: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
5510: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
5520: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
5530: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
5540: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
5550: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
5560: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
5570: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
5580: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28  lFunction(db, ((
5590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
55a0: 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  )p4)->pFunc);.  
55b0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
55c0: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e  rough into the n
55d0: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
55e0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
55f0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
5600: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
5610: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
5620: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
5630: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
5640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5650: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
5660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5670: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
5680: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
5690: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
56a0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
56b0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
56c0: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
56d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
56e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
56f0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
5700: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5710: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5720: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
5730: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
5740: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5750: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
5760: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
5770: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
5780: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
5790: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
57a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
57b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
57c0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
57d0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
57e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
57f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
5800: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
5810: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
5820: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
5830: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
5840: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5850: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
5860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5870: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
5880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
5890: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
58a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
58b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
58c0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
58d0: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
58e0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
58f0: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
5900: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
5910: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20   *)p4);.        
5920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5930: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
5940: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
5950: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
5960: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
5970: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
5980: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
5990: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
59a0: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
59b0: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
59c0: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
59d0: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
59e0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
59f0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
5a00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
5a10: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
5a20: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
5a30: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
5a40: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
5a50: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
5a60: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
5a70: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5a80: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
5a90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5aa0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5ab0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
5ac0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
5ad0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
5ae0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
5af0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5b00: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
5b10: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
5b20: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
5b30: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5b40: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
5b50: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
5b60: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
5b70: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
5b80: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
5b90: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
5ba0: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
5bb0: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
5bc0: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
5bd0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
5be0: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
5bf0: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
5c00: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
5c10: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
5c20: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
5c30: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
5c40: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
5c50: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
5c60: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
5c70: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20  OP_Noop.*/.void 
5c80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5c90: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
5ca0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66   int addr){.  if
5cb0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b  ( addr<p->nOp ){
5cc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
5cd0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5cf0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66  b = p->db;.    f
5d00: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
5d10: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
5d20: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  );.    memset(pO
5d30: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
5d40: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  [0]));.    pOp->
5d50: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
5d60: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d  ;.    if( addr==
5d70: 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f  p->nOp-1 ) p->nO
5d80: 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
5d90: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70  * If the last op
5da0: 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64  code is "op" and
5db0: 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d   it is not a jum
5dc0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a  p destination,.*
5dd0: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74  * then remove it
5de0: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
5df0: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e  f and only if an
5e00: 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f   opcode was remo
5e10: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
5e20: 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69  te3VdbeDeletePri
5e30: 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  orOpcode(Vdbe *p
5e40: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20  , u8 op){.  if( 
5e50: 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70  (p->nOp-1)>(p->p
5e60: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29  Parse->iFixedOp)
5e70: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
5e80: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
5e90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5ea0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
5eb0: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20  , p->nOp-1);.   
5ec0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
5ed0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
5ee0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
5ef0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
5f00: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
5f10: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
5f20: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
5f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5f40: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
5f50: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
5f60: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
5f70: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
5f80: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
5f90: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
5fa0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
5fb0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
5fc0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
5fd0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
5fe0: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
5ff0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
6000: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
6010: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
6020: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
6030: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
6040: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
6050: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
6060: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
6070: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
6080: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
6090: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
60a0: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
60b0: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
60c0: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
60d0: 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68   zP4..** .** Oth
60e0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
60f0: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
6100: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
6110: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
6120: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
6130: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
6140: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
6150: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
6160: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
6170: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
6180: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
6190: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
61a0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
61b0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
61c0: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
61d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
61e0: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
61f0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
6200: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
6210: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
6220: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
6230: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
6240: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
6250: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
6260: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
6270: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
6280: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6290: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
62a0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
62b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
62c0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d  d ){.    if( n!=
62d0: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20  P4_VTAB ){.     
62e0: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
62f0: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
6300: 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zP4);.    }.    
6310: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
6320: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
6330: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
6340: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
6350: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
6360: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6370: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
6380: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61  ->aOp[addr];.  a
6390: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
63a0: 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20  pe==P4_NOTUSED. 
63b0: 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34        || pOp->p4
63c0: 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20  type==P4_INT32. 
63d0: 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34        || pOp->p4
63e0: 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
63f0: 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c   );.  freeP4(db,
6400: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6410: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
6420: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
6430: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
6440: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
6450: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
6460: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
6470: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
6480: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
6490: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
64a0: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
64b0: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
64c0: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
64d0: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
64e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
64f0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
6500: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
6510: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
6520: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
6530: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
6540: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
6550: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
6560: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6570: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6580: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
6590: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
65a0: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
65b0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
65c0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
65d0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
65e0: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
65f0: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
6600: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
6610: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
6620: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
6630: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
6640: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
6650: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
6660: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
6670: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
6680: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
6690: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
66a0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
66b0: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
66c0: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
66d0: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
66e0: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
66f0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6700: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
6710: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34  /*.** Set the P4
6720: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6730: 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f  ently added opco
6740: 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  de to the KeyInf
6750: 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64  o for the.** ind
6760: 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  ex given..*/.voi
6770: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
6780: 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  P4KeyInfo(Parse 
6790: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
67a0: 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76  pIdx){.  Vdbe *v
67b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
67c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
67d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
67e0: 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  dx!=0 );.  sqlit
67f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6800: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c  , -1, (char*)sql
6810: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
6820: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
6830: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6840: 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
6850: 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  FO);.}..#ifdef S
6860: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
6870: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a  LAIN_COMMENTS./*
6880: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
6890: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  omment on the mo
68a0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
68b0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
68c0: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
68d0: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
68e0: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
68f0: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
6900: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
6910: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
6920: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
6930: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
6940: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
6950: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
6960: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  ion build..*/.st
6970: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43  atic void vdbeVC
6980: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
6990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
69a0: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
69b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
69c0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
69d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
69e0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
69f0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
6a00: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
6a10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6a20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
6a30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6a40: 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c  ->aOp );.    sql
6a50: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
6a60: 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  , p->aOp[p->nOp-
6a70: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  1].zComment);.  
6a80: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
6a90: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71  1].zComment = sq
6aa0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
6ab0: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
6ac0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
6ad0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
6ae0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
6af0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
6b00: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6b10: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
6b20: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
6b30: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
6b40: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
6b50: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
6b60: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
6b70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6b80: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
6b90: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6ba0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6bb0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6bc0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
6bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6be0: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  p, OP_Noop);.   
6bf0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
6c00: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
6c10: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
6c20: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
6c30: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
6c40: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
6c50: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
6c60: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
6c70: 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  E./*.** Set the 
6c80: 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72  value if the iSr
6c90: 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20  cLine field for 
6ca0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63  the previously c
6cb0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
6cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6cd0: 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62  3VdbeSetLineNumb
6ce0: 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  er(Vdbe *v, int 
6cf0: 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65  iLine){.  sqlite
6d00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
6d10: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
6d20: 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ne;.}.#endif /* 
6d30: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
6d40: 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RAGE */../*.** R
6d50: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
6d60: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
6d70: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
6d80: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
6d90: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
6da0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
6db0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
6dc0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6dd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6de0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
6df0: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
6e00: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
6e10: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
6e20: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
6e30: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
6e40: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
6e50: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
6e60: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
6e70: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
6e80: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
6e90: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
6ea0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
6eb0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
6ec0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
6ed0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
6ee0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
6ef0: 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69   an OOM fault wi
6f00: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
6f10: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
6f20: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
6f30: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6f40: 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   is a valid poin
6f50: 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73  ter.  But becaus
6f60: 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f  e the dummy.opco
6f70: 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d  de is 0,.** dumm
6f80: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
6f90: 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69  written to.  Thi
6fa0: 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  s is verified by
6fb0: 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e   code inspection
6fc0: 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69   and.** by runni
6fd0: 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64  ng with Valgrind
6fe0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
6ff0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
7000: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
7010: 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69  {.  /* C89 speci
7020: 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  fies that the co
7030: 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77  nstant "dummy" w
7040: 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
7050: 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a  ed to all.  ** z
7060: 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63  eros, which is c
7070: 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65  orrect.  MSVC ge
7080: 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e  nerates a warnin
7090: 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e  g, nevertheless.
70a0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62   */.  static Vdb
70b0: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
70c0: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
70d0: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
70e0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
70f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
7100: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
7110: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
7120: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
7130: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
7140: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
7150: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
7160: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
7170: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7180: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7190: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
71a0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
71b0: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
71c0: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
71d0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
71e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
71f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7200: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a  IN_COMMENTS)./*.
7210: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
7220: 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f  eger value for o
7230: 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ne of the parame
7240: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f  ters to the opco
7250: 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d  de pOp.** determ
7260: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
7270: 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r c..*/.static i
7280: 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68  nt translateP(ch
7290: 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a  ar c, const Op *
72a0: 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27  pOp){.  if( c=='
72b0: 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  1' ) return pOp-
72c0: 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32  >p1;.  if( c=='2
72d0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
72e0: 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27  p2;.  if( c=='3'
72f0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
7300: 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20  3;.  if( c=='4' 
7310: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34  ) return pOp->p4
7320: 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  .i;.  return pOp
7330: 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->p5;.}../*.** C
7340: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
7350: 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74  for the "comment
7360: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42  " field of a VDB
7370: 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67  E opcode listing
7380: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f  ..**.** The Syno
7390: 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63  psis: field in c
73a0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76  omments in the v
73b0: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  dbe.c source fil
73c0: 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64  e gets converted
73d0: 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20  .** to an extra 
73e0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61  string that is a
73f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
7400: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7410: 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61  ().  In the.** a
7420: 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20  bsence of other 
7430: 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73  comments, this s
7440: 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20  ynopsis becomes 
7450: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
7460: 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f  he opcode..** So
7470: 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f  me translation o
7480: 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ccurs:.**.**    
7490: 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20     "PX"      -> 
74a0: 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20   "r[X]".**      
74b0: 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22   "PX@PY"   ->  "
74c0: 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72  r[X..X+Y-1]"  or
74d0: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
74e0: 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20  0 or 1.**       
74f0: 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72  "PX@PY+1" ->  "r
7500: 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20  [X..X+Y]"    or 
7510: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
7520: 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50  .**       "PY..P
7530: 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d  Y"  ->  "r[X..Y]
7540: 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  "      or "r[x]"
7550: 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74   if y<=x.*/.stat
7560: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
7570: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
7580: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
7590: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
75a0: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
75b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
75c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
75d0: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
75e0: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
75f0: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
7600: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
7610: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
7620: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
7630: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
7640: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
7650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
7660: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
7670: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
7680: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
7690: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f  int ii, jj;.  zO
76a0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
76b0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
76c0: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
76d0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
76e0: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
76f0: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
7700: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
7710: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
7720: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
7730: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
7740: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
7750: 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a  1;.    for(ii=jj
7760: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
7770: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
7780: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
7790: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
77a0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
77b0: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
77c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
77d0: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
77e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
77f0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7800: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
7810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7820: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
7830: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7840: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7850: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7860: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
7870: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
7880: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
7890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
78a0: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
78b0: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
78d0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
78e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
78f0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7900: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
7910: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
7920: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
7930: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
7940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
7950: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
7960: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
7970: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
7980: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
7990: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
79a0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
79b0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
79c0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
79d0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22  nopsis+ii+1,"+1"
79e0: 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
79f0: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b          ii += 2;
7a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
7a10: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2++;.           
7a20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
7a30: 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20  f( v2>1 ){.     
7a40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7a50: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7a60: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e  jj, zTemp+jj, ".
7a70: 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a  .%d", v1+v2-1);.
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7a90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7aa0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7ab0: 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22  sis+ii+1, "..P3"
7ac0: 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  , 4)==0 && pOp->
7ad0: 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p3==0 ){.       
7ae0: 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20       ii += 4;.  
7af0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b00: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b    }.        jj +
7b10: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7b20: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
7b30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b40: 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20    zTemp[jj++] = 
7b50: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
7b60: 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f  .    if( !seenCo
7b70: 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20  m && jj<nTemp-5 
7b80: 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  && pOp->zComment
7b90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7ba0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7bb0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
7bc0: 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ; %s", pOp->zCom
7bd0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20  ment);.      jj 
7be0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
7bf0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
7c00: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e    }.    if( jj<n
7c10: 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d  Temp ) zTemp[jj]
7c20: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
7c30: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
7c40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
7c50: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7c60: 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  Temp, "%s", pOp-
7c70: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
7c80: 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  jj = sqlite3Strl
7c90: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  en30(zTemp);.  }
7ca0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b  else{.    zTemp[
7cb0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d  0] = 0;.    jj =
7cc0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7cd0: 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   jj;.}.#endif /*
7ce0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
7cf0: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
7d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
7d10: 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AIN) || !defined
7d20: 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20  (NDEBUG) \.     
7d30: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
7d40: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
7d50: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
7d60: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
7d70: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
7d80: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
7d90: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
7da0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
7db0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
7dc0: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
7dd0: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
7de0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
7df0: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
7e00: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
7e10: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
7e20: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
7e30: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
7e40: 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  20 );.  switch( 
7e50: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
7e60: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
7e70: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
7e80: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
7e90: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
7ea0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
7eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7ec0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
7ed0: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
7ee0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ef0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7f00: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
7f10: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
7f20: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
7f30: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
7f40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
7f50: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
7f60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
7f70: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
7f80: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
7f90: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
7fa0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
7fb0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
7fc0: 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20  ame : "nil";.   
7fd0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
7fe0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
7ff0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
8000: 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28   n==6 && memcmp(
8010: 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36  zColl,"BINARY",6
8020: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8030: 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20    zColl = "B";. 
8040: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a           n = 1;.
8050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8060: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
8070: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  7 ){.          m
8080: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
8090: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
80a0: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
80b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
80c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
80d0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
80e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
80f0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8100: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
8110: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
8120: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  '-';.        }. 
8130: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
8140: 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20  Temp[i], zColl, 
8150: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20  n+1);.        i 
8160: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
8170: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
8180: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
8190: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
81a0: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
81b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
81c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
81d0: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
81e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
81f0: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
8200: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
8210: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8220: 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29   zTemp, "(%.20s)
8230: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
8240: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8250: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8260: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
8270: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
8280: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
8290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
82a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
82b0: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
82c0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
82d0: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
82e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
82f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8300: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
8310: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
8320: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
8330: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
8340: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
8350: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8360: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
8370: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
8380: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
8390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
83a0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
83b0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
83c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
83d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
83e0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
83f0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
8400: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8410: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
8420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8430: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8440: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
8450: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
8460: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8470: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
8480: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8490: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
84a0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
84b0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
84c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
84d0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
84e0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
84f0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
8500: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
8510: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
8520: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
8530: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
8540: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
8550: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
8560: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
8570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8580: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
8590: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
85a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
85b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
85c0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
85d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
85e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
85f0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
8600: 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
8610: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
8620: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
8630: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8640: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8650: 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b   zTemp, "NULL");
8660: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
8680: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
8690: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
86a0: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
86b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
86c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
86d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
86e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
86f0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
8700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
8710: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
8720: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
8730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8740: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8750: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22  zTemp, "vtab:%p"
8760: 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  , pVtab);.      
8770: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8780: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
8790: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
87a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
87b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
87c0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
87d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
87e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
87f0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
8800: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8810: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8820: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
8830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8840: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
8850: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
8860: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
8870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8880: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
8890: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
88a0: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
88b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
88c0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
88d0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
88e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
88f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
8900: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
8910: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
8920: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
8930: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
8940: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
8950: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
8960: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
8970: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8980: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
8990: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
89a0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
89b0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
89c0: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
89d0: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
89e0: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
89f0: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
8a00: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
8a10: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
8a20: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
8a30: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
8a40: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
8a50: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8a60: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
8a70: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
8a80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
8a90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
8aa0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
8ab0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
8ac0: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
8ad0: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
8ae0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
8af0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
8b00: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
8b10: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
8b20: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
8b30: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
8b40: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
8b50: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
8b60: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
8b70: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
8b80: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
8b90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8ba0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8bb0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
8bc0: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
8bd0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
8be0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
8bf0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
8c00: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
8c10: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
8c20: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
8c30: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
8c40: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
8c50: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
8c60: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
8c70: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
8c80: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
8c90: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
8ca0: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
8cb0: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
8cc0: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
8cd0: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
8ce0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
8cf0: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
8d00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
8d10: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
8d20: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
8d30: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
8d40: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
8d50: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
8d60: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
8d70: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
8d80: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
8d90: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
8da0: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
8db0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
8dc0: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
8dd0: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
8de0: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
8df0: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
8e00: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
8e10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8e20: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
8e30: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
8e40: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
8e50: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
8e60: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8e70: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
8e80: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
8e90: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
8ea0: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
8eb0: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
8ec0: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
8ed0: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
8ee0: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
8ef0: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
8f00: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
8f10: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
8f20: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
8f30: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
8f40: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
8f50: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
8f60: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
8f70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8f80: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
8f90: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
8fa0: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
8fb0: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
8fc0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
8fd0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
8fe0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8ff0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
9000: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
9010: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
9020: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
9030: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9040: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9050: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
9060: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
9070: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
9080: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
9090: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
90a0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
90b0: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
90c0: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
90d0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
90e0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
90f0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
9100: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
9110: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9120: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9130: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9140: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
9150: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
9160: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
9170: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
9180: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
9190: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
91a0: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
91b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
91c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
91d0: 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  vdbeLeave(Vdbe *
91e0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
91f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9200: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9210: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
9220: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
9230: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
9240: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9250: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
9260: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
9270: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
9280: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
9290: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
92a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
92b0: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
92c0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
92d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
92e0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
92f0: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9300: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9310: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9320: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9330: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
9340: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9350: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
9360: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
9370: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9380: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
9390: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
93a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
93b0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
93c0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
93d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
93e0: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
93f0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
9400: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
9410: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
9420: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
9430: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9440: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
9450: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
9460: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
9470: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
9480: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
9490: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
94a0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
94b0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
94c0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
94d0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
94e0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
94f0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
9500: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
9510: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
9520: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
9530: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
9540: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
9550: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
9560: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9570: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
9580: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
9590: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
95a0: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
95b0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
95c0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
95d0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
95e0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
95f0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
9600: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
9610: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
9620: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
9630: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
9640: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
9650: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
9660: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
9670: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
9680: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
9690: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
96a0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
96b0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
96c0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
96d0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
96e0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
96f0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
9700: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
9710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9720: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
9730: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
9740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
9750: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
9760: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
9770: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
9780: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
9790: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
97a0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
97b0: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
97c0: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
97d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
97e0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
97f0: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
9800: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
9810: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
9820: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9830: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
9840: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
9850: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
9860: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
9870: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
9880: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
9890: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
98a0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
98b0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
98c0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
98d0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
98e0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
98f0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
9900: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
9910: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
9920: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
9930: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
9940: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
9950: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
9960: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
9970: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
9980: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
9990: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
99a0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
99b0: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
99c0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
99d0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
99e0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
99f0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
9a00: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
9a10: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
9a20: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
9a30: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
9a40: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
9a50: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
9a60: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
9a70: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
9a80: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
9a90: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
9aa0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
9ab0: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
9ac0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
9ad0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
9ae0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
9af0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
9b00: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
9b10: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
9b20: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9b30: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
9b40: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
9b50: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
9b60: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
9b70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9b80: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
9b90: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
9ba0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
9bb0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
9bc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
9bd0: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
9be0: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
9bf0: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
9c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c10: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
9c20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9c30: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
9c40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
9c50: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
9c60: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
9c70: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
9c80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
9c90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
9ca0: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
9cb0: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
9cc0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
9cd0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
9ce0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
9cf0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
9d00: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
9d10: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
9d20: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
9d30: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
9d40: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
9d50: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
9d60: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9d70: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
9d80: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
9d90: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
9da0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
9db0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
9dc0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
9dd0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
9de0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
9df0: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
9e00: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
9e10: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
9e20: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9e30: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
9e40: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
9e50: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
9e60: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
9e70: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
9e80: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
9e90: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
9ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9eb0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
9ec0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
9ed0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
9ee0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
9ef0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
9f00: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
9f10: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
9f20: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
9f30: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
9f40: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
9f50: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
9f60: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
9f70: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
9f80: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
9f90: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
9fa0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
9fb0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
9fc0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
9fd0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
9fe0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
9ff0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
a000: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
a010: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
a020: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
a030: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
a040: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
a050: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
a060: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
a070: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
a080: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
a090: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
a0a0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
a0b0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
a0c0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
a0d0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
a0e0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
a0f0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
a100: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
a110: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
a120: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
a150: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
a180: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
a190: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
a1a0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a1d0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
a1e0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
a1f0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
a200: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
a210: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
a220: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
a230: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
a260: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
a270: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
a280: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
a290: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
a2a0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
a2b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a2c0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a2f0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
a300: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a320: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
a330: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
a340: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
a350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a360: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
a370: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
a380: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
a390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a3a0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a3b0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
a3c0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
a3d0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
a3e0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
a3f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a400: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
a410: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
a420: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
a430: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
a440: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
a450: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
a460: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
a470: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
a480: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
a490: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
a4a0: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
a4b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
a4c0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
a4d0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
a4e0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
a4f0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
a500: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
a510: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a520: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a530: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
a540: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
a550: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
a560: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
a570: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
a580: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
a590: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
a5a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a5b0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
a5c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a5d0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
a5e0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
a5f0: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
a600: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
a610: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
a620: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
a630: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
a640: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
a650: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
a660: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
a670: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
a680: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
a690: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
a6a0: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
a6b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a6c0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
a6d0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
a6e0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
a6f0: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
a700: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
a710: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
a720: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a730: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
a740: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
a750: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
a760: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
a770: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
a780: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
a790: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
a7a0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
a7b0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
a7c0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
a7d0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
a7e0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
a7f0: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
a800: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
a810: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
a820: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
a830: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
a840: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a850: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
a860: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
a870: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
a880: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
a890: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
a8a0: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
a8b0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
a8c0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
a8d0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
a8e0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
a8f0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
a900: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
a910: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
a920: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
a930: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
a940: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
a950: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
a960: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
a970: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
a980: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
a990: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
a9a0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
a9b0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
a9c0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
a9d0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
a9e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
a9f0: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
aa00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
aa10: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
aa20: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
aa30: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
aa40: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
aa50: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
aa60: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
aa70: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
aa80: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
aa90: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
aaa0: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
aab0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
aac0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
aad0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
aae0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
aaf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
ab00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
ab10: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
ab20: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
ab30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
ab40: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
ab50: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
ab60: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
ab70: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
ab80: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
ab90: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
aba0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
abb0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
abc0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
abd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
abe0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
abf0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
ac00: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
ac10: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
ac20: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
ac30: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
ac40: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
ac50: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
ac60: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
ac70: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
ac80: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
ac90: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
aca0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
acb0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
acc0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
acd0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
ace0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
acf0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
ad00: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
ad10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ad20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
ad30: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad60: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
ad70: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
ad80: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
ad90: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
ada0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
adb0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
adc0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
add0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
ade0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
adf0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
ae00: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
ae10: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
ae20: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
ae30: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
ae40: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
ae50: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
ae60: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ae70: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
ae80: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
ae90: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
aea0: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
aeb0: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
aec0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
aed0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
aee0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
aef0: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
af00: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
af10: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
af20: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
af30: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
af40: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
af50: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
af60: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
af70: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
af80: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
af90: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
afa0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
afb0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
afc0: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
afd0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
afe0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
aff0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b000: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
b010: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
b020: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
b030: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
b040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b050: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
b060: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
b070: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
b080: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
b090: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
b0a0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
b0b0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
b0d0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
b0e0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
b0f0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
b100: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
b110: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
b120: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
b130: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
b140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b150: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
b160: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b170: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
b180: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
b1b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
b1c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b1d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
b1e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
b210: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b220: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b230: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
b240: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
b270: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
b280: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
b290: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
b2a0: 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29  size(pMem, 32) )
b2b0: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
b2c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
b2d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b2f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
b300: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
b310: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
b320: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
b330: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
b340: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
b350: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
b360: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b370: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
b380: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
b390: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
b3a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b3b0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
b3c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
b3d0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
b3e0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
b3f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
b400: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
b410: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
b420: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
b430: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
b440: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
b450: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
b460: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
b470: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b480: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b490: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
b4a0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b4c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b4d0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
b4e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
b4f0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b500: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
b510: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
b520: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
b530: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
b540: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
b550: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
b560: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
b570: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
b580: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
b590: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
b5a0: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
b5b0: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
b5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b5d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b5e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
b5f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b610: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b620: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
b630: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
b640: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
b650: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
b660: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
b670: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
b680: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
b690: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
b6a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
b6d0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
b6e0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
b6f0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
b700: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
b710: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
b720: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
b730: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b740: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
b750: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
b760: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
b770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
b780: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
b790: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
b7a0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
b7b0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
b7c0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
b7d0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
b7e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
b7f0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
b800: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b810: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
b820: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
b830: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
b840: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
b850: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
b860: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
b870: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
b880: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
b890: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
b8a0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
b8b0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
b8c0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
b8d0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
b8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b8f0: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
b900: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
b910: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
b920: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b930: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
b940: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b950: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
b960: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
b970: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
b980: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
b990: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b9a0: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
b9b0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
b9c0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
b9d0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
b9e0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
b9f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ba00: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
ba10: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
ba20: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
ba30: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
ba40: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
ba50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
ba60: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
ba70: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
ba80: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ba90: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
baa0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
bab0: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
bac0: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
bad0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
bae0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
baf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
bb00: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
bb10: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
bb20: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
bb30: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
bb40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bb60: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
bb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bb80: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
bb90: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
bba0: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
bbb0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
bbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
bbd0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
bbe0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
bbf0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
bc00: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
bc10: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
bc20: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
bc30: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
bc40: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
bc50: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
bc60: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
bc70: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
bc80: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
bc90: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
bca0: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
bcb0: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
bcc0: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
bcd0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
bce0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
bcf0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
bd00: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
bd10: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
bd20: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
bd30: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
bd40: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
bd50: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
bd60: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
bd70: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
bd80: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
bd90: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
bda0: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
bdb0: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
bdc0: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
bdd0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
bde0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
bdf0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
be00: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
be10: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
be20: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
be30: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
be40: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
be50: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
be60: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
be70: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
be80: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
be90: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
bea0: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
beb0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
bec0: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
bed0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
bee0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
bef0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
bf00: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
bf10: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
bf20: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
bf30: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
bf40: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
bf50: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
bf60: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
bf70: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
bf80: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
bf90: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
bfa0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
bfb0: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
bfc0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
bfd0: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
bfe0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
bff0: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
c000: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
c010: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
c020: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
c030: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
c040: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
c050: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
c060: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
c070: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
c080: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
c090: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
c0a0: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
c0b0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
c0c0: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
c0d0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
c0e0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
c0f0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
c100: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
c110: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
c120: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
c130: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
c140: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
c150: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
c160: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
c170: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
c180: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
c190: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
c1a0: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
c1b0: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
c1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
c1d0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
c1e0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
c1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
c200: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
c210: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
c220: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
c230: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
c240: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c250: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
c260: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
c270: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
c280: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
c290: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
c2a0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
c2b0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
c2c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
c2d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
c2e0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
c2f0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
c300: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
c310: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
c320: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
c330: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
c340: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
c350: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
c360: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
c370: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c380: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
c390: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
c3a0: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
c3b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
c3c0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
c3d0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
c3e0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
c3f0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
c400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
c410: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
c420: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
c430: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
c440: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
c450: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
c460: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
c470: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
c480: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
c490: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
c4a0: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
c4b0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
c4c0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
c4d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c4e0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
c4f0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
c500: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
c510: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
c520: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
c530: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
c540: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
c550: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
c560: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
c570: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
c580: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
c590: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
c5a0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
c5b0: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
c5c0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
c5d0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
c5e0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
c5f0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
c600: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
c610: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
c620: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
c630: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
c640: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
c650: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c660: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
c670: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
c680: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
c690: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
c6a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c6b0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
c6c0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
c6d0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
c6e0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
c6f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c700: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
c710: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
c720: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
c730: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
c740: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
c750: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
c760: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
c770: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
c780: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
c790: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
c7a0: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
c7b0: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
c7c0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
c7d0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
c7e0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
c7f0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
c800: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
c810: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
c820: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
c830: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
c840: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
c850: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
c860: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
c870: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
c880: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c890: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
c8a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c8b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
c8c0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
c8d0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
c8e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c8f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
c900: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c930: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c940: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
c970: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
c980: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9a0: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
c9b0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
c9c0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c9f0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
ca00: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ca30: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
ca40: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
ca50: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca70: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
ca80: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
ca90: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cac0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
cad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
cae0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
caf0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
cb00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
cb10: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb30: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
cb40: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
cb50: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
cb60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
cb70: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
cb80: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
cb90: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
cba0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
cbb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
cbc0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
cbd0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
cbe0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
cbf0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
cc00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
cc10: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
cc20: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
cc30: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
cc40: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
cc50: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
cc60: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
cc70: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
cc80: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
cc90: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
cca0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
ccb0: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
ccc0: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
ccd0: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
cce0: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
ccf0: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
cd00: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
cd10: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
cd20: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
cd30: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
cd40: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
cd50: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
cd60: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
cd70: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
cd80: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
cd90: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
cda0: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
cdb0: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
cdc0: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
cdd0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
cde0: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
cdf0: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
ce00: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
ce10: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
ce20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
ce30: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
ce40: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
ce50: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
ce60: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
ce70: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
ce80: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
ce90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cea0: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
ceb0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
cec0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
ced0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
cee0: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
cef0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
cf00: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
cf10: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
cf20: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
cf30: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
cf40: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
cf50: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
cf60: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20  arguments in..  
cf70: 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a  */.  zCsr = (u8*
cf80: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
cf90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cfa0: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
cfb0: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
cfc0: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
cfd0: 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d  )&p->aOp[pParse-
cfe0: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
cff0: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
d000: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
d010: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
d020: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
d030: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
d040: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
d050: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
d060: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
d070: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
d080: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
d090: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
d0a0: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
d0b0: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
d0c0: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
d0d0: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
d0e0: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
d0f0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
d100: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
d110: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
d120: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
d130: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
d140: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
d150: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
d160: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
d170: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
d180: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
d190: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
d1a0: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
d1b0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
d1c0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
d1d0: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
d1e0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
d1f0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
d200: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
d210: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
d220: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
d230: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
d240: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
d250: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
d260: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
d270: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
d280: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
d290: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
d2a0: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
d2b0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
d2c0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
d2d0: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
d2e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
d2f0: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
d300: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
d310: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
d320: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
d330: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
d340: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
d350: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
d360: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
d370: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
d380: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
d390: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
d3a0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d3b0: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
d3c0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
d3d0: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
d3e0: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
d3f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
d400: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
d410: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
d420: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
d430: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
d440: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
d450: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
d460: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
d470: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
d480: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d490: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
d4a0: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
d4b0: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
d4c0: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
d4d0: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
d500: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
d510: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
d520: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
d530: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
d540: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d550: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d560: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
d570: 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
d580: 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
d590: 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f  p->anExec, p->nO
d5a0: 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 26  p*sizeof(i64), &
d5b0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
d5c0: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
d5d0: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
d5e0: 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71     p->pFree = sq
d5f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
d600: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
d610: 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70    }.    zCsr = p
d620: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e  ->pFree;.    zEn
d630: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
d640: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74  ;.  }while( nByt
d650: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
d660: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
d670: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
d680: 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  r;.  p->nOnceFla
d690: 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  g = nOnce;.  if(
d6a0: 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20   p->aVar ){.    
d6b0: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
d6c0: 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e  )nVar;.    for(n
d6d0: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
d6e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  {.      p->aVar[
d6f0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
d700: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ull;.      p->aV
d710: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
d720: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d730: 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72 73  ->azVar && pPars
d740: 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20  e->nzVar>0 ){.  
d750: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
d760: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
d770: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
d780: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
d790: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
d7a0: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
d7b0: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
d7c0: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
d7d0: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
d7e0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
d7f0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
d800: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
d810: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d830: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
d840: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
d850: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
d880: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
d890: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
d8a0: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
d8b0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
d8c0: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
d8d0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
d8e0: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
d8f0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
d900: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
d910: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
d920: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
d930: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
d940: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
d950: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
d960: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
d970: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
d980: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
d990: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
d9a0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
d9b0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
d9c0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
d9d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
d9e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
d9f0: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
da00: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
da10: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
da20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
da30: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
da40: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
da50: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
da60: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
da70: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
da80: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
da90: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
daa0: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
dab0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
dac0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
dad0: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
dae0: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
daf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
db00: 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65  TUALTABLE.  else
db10: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
db20: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
db30: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
db40: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
db50: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
db60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
db70: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
db80: 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f  ule = pVtabCurso
db90: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
dba0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
dbb0: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
dbc0: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
dbd0: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
dbe0: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
dbf0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
dc00: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
dc10: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
dc20: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
dc30: 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
dc40: 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
dc50: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
dc60: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
dc70: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
dc80: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
dc90: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
dca0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
dcb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
dcc0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
dcd0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
dce0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
dcf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
dd00: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
dd10: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
dd20: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
dd30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
dd40: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
dd50: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
dd60: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
dd70: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
dd80: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
dd90: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
dda0: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
ddb0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
ddc0: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
ddd0: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
dde0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
ddf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
de00: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
de10: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
de20: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
de30: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
de40: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
de50: 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
de60: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
de70: 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
de80: 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
de90: 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
dea0: 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   v->aOnceFlag = 
deb0: 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
dec0: 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61  g;.  v->nOnceFla
ded0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63  g = pFrame->nOnc
dee0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20  eFlag;.  v->aOp 
def0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
df00: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
df10: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
df20: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
df30: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
df40: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
df50: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
df60: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
df70: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
df80: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
df90: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
dfa0: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
dfb0: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
dfc0: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
dfd0: 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20   v->db->nChange 
dfe0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61  = pFrame->nDbCha
dff0: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
e000: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
e010: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
e020: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
e030: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
e040: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
e050: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
e060: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
e070: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
e080: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
e090: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
e0a0: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
e0b0: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
e0c0: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
e0d0: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
e0e0: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
e0f0: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
e100: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
e110: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e120: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
e130: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
e140: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
e150: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
e160: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
e170: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
e180: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
e190: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
e1a0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
e1b0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
e1c0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
e1d0: 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
e1e0: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
e1f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
e200: 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
e210: 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
e220: 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
e230: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
e240: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
e250: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
e260: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
e270: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
e280: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
e290: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
e2a0: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
e2b0: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
e2c0: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
e2d0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
e2e0: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
e2f0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
e300: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
e310: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
e320: 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70  he VM */.  if( p
e330: 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c  ->pAuxData ) sql
e340: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
e350: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
e360: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
e370: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
e380: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
e390: 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69  he VM after a si
e3a0: 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61  ngle run..*/.sta
e3b0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
e3c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
e3d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
e3e0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e3f0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
e400: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
e410: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
e420: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
e430: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
e440: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
e450: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
e460: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
e470: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
e480: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
e490: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
e4a0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
e4b0: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
e4c0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
e4d0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
e4e0: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
e4f0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
e500: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
e510: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
e520: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
e530: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e540: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
e550: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
e560: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
e570: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
e580: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
e590: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
e5a0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
e5b0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
e5c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
e5d0: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
e5e0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
e5f0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
e600: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
e610: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
e620: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
e630: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
e640: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
e650: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
e660: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
e670: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
e680: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e690: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
e6a0: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
e6b0: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
e6c0: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
e6d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e6e0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
e6f0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
e700: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
e710: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
e720: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
e730: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
e740: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
e750: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
e760: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
e770: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
e780: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
e790: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
e7a0: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
e7b0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
e7c0: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
e7d0: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
e7e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
e7f0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
e800: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
e810: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
e820: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
e830: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
e840: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
e850: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
e860: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
e870: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
e880: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
e890: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
e8a0: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
e8b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
e8c0: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
e8d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e8e0: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
e8f0: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
e900: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
e910: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
e920: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
e930: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
e940: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
e950: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
e960: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
e970: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
e980: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
e990: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
e9a0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
e9b0: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
e9c0: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
e9d0: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
e9e0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
e9f0: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
ea00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ea10: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
ea20: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea40: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
ea50: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
ea60: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea80: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
ea90: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
eaa0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
ead0: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
eae0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
eaf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
eb00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
eb10: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
eb20: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
eb30: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
eb40: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
eb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
eb60: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
eb70: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
eb80: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
eb90: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
eba0: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
ebb0: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
ebc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
ebd0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
ebe0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
ebf0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
ec00: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
ec10: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
ec20: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
ec30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ec40: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ec50: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
ec60: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
ec70: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
ec80: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
ec90: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
eca0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
ecb0: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
ecc0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
ecd0: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
ece0: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
ecf0: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
ed00: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
ed10: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
ed20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
ed30: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
ed40: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
ed50: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
ed60: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
ed70: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
ed80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ed90: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
eda0: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
edb0: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
edc0: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
edd0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
ede0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
edf0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
ee00: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
ee10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
ee20: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
ee30: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
ee40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
ee50: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
ee60: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
ee70: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
ee80: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
ee90: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
eea0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
eeb0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eec0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
eed0: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
eee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
eef0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ef00: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
ef10: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
ef20: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
ef30: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
ef40: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
ef50: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
ef60: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
ef70: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
ef80: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
ef90: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
efa0: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
efb0: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
efc0: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
efd0: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
efe0: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
eff0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
f000: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
f010: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
f020: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
f030: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
f040: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
f050: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
f060: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
f070: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
f080: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
f090: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
f0a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
f0b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f0c0: 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
f0d0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
f0e0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
f0f0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
f100: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
f110: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
f120: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
f130: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
f140: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
f150: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
f160: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
f170: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
f180: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
f190: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
f1a0: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
f1b0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
f1c0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
f1d0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
f1e0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
f1f0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
f200: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
f210: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
f220: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f230: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
f240: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
f250: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
f260: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
f270: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
f280: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
f290: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
f2a0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
f2b0: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
f2c0: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
f2d0: 71 6c 69 74 65 33 42 74 72 65 65 45 78 63 6c 75  qlite3BtreeExclu
f2e0: 73 69 76 65 4c 6f 63 6b 28 70 42 74 29 3b 0a 20  siveLock(pBt);. 
f2f0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
f300: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f310: 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20  ONCURRENT.  if( 
f320: 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
f330: 26 26 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d  && (rc & 0xFF)==
f340: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
f350: 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f     /* An SQLITE_
f360: 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 42  BUSY or SQLITE_B
f370: 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 77 61 73  USY_SNAPSHOT was
f380: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
f390: 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d  le .    ** attem
f3a0: 70 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68  pting to take th
f3b0: 65 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e  e WRITER lock on
f3c0: 20 61 20 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c   a wal file. Rel
f3d0: 65 61 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ease the.    ** 
f3e0: 57 52 49 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20  WRITER locks on 
f3f0: 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73 20 61 6e  all wal files an
f400: 64 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  d return early. 
f410: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f420: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f430: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
f440: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f450: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
f460: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
f470: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
f480: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f490: 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
f4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f4b0: 72 44 72 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f  rDropExclusiveLo
f4c0: 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
f4d0: 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
f4e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f4f0: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
f500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
f510: 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 21 3d  ndif..  if( rc!=
f520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f540: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
f550: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
f560: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
f570: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
f580: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
f590: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
f5a0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
f5b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
f5c0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
f5d0: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
f5e0: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
f5f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f600: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f610: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20  NT_COMMITHOOK;. 
f620: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
f630: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
f640: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
f650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f660: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
f670: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
f680: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
f690: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
f6a0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
f6b0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
f6c0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
f6d0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
f6e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
f6f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f700: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
f710: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
f720: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
f730: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
f740: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
f750: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
f760: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
f770: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
f780: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
f790: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
f7a0: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
f7b0: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
f7c0: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
f7d0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
f7e0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
f7f0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
f800: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
f810: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
f820: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
f830: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f840: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
f850: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
f860: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
f870: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
f880: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
f890: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f8a0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
f8b0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
f8c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
f8d0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
f8e0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
f8f0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
f900: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
f910: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
f920: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
f930: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
f940: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
f950: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
f960: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
f970: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
f980: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
f990: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
f9a0: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
f9b0: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
f9c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
f9d0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
f9e0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
f9f0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
fa00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
fa10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
fa20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
fa30: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
fa40: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
fa50: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
fa60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fa70: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
fa80: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
fa90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
faa0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
fab0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fac0: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
fad0: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
fae0: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
faf0: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
fb00: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
fb10: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
fb20: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
fb30: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
fb40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fb50: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
fb70: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
fb80: 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  tomically..  */.
fb90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fba0: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
fbb0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
fbc0: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
fbd0: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
fbe0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
fbf0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
fc00: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
fc10: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
fc20: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
fc30: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
fc40: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
fc50: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
fc60: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
fc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
fc80: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
fc90: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
fca0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
fcb0: 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
fcc0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
fcd0: 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
fce0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
fcf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
fd00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
fd10: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
fd20: 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
fd30: 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
fd40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
fd50: 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
fd60: 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
fd70: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
fd80: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
fd90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fda0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
fdb0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
fdc0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
fdd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
fde0: 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
fdf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fe00: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
fe10: 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
fe20: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
fe30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
fe40: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
fe50: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
fe60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fe70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
fe80: 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
fe90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fea0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
feb0: 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
fec0: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
fed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fee0: 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
fef0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
ff00: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
ff10: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
ff20: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
ff30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ff40: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
ff50: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
ff60: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
ff90: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
ffa0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
ffb0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
ffc0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
ffd0: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
ffe0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
fff0: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
10000 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
10010 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
10020 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
10030 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
10040 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
10050 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
10060 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
10070 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
10080 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
10090 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
100a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
100b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
100c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
100d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
100e0 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
100f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10100 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
10110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
10130 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
10140 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
10150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10160 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
10170 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
10180 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
10190 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
101a0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
101b0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
101c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
101d0 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
101e0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
101f0 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
10200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
10210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10220 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10230 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
10240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10250 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
10260 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
10270 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
10280 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
10290 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
102a0 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
102b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
102c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
102d0 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
102e0 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
102f0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
10300 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10310 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
10320 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
10330 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
10340 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
10350 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10360 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
10370 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
10380 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
10390 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
103a0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
103b0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
103c0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
103d0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
103e0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
103f0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
10400 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
10410 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
10420 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
10430 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
10440 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
10450 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
10460 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
10470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
10480 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
10490 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
104a0 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
104b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
104c0 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
104d0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
104e0 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
104f0 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
10500 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
10510 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
10520 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
10530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
10540 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10550 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
10560 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
10570 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
10580 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
10590 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
105a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
105b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
105c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
105d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
105e0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
105f0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
10600 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10610 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
10620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
10630 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10640 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
10650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10670 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
10680 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
10690 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
106a0 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
106b0 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
106c0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
106d0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
106e0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
106f0 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
10700 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
10710 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
10720 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
10730 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
10740 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
10750 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
10760 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
10770 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
10780 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
10790 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
107a0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
107b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
107c0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
107d0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
107e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
107f0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
10800 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
10810 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
10820 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
10830 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
10840 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
10850 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
10860 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
10870 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10880 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
10890 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
108a0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
108b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108c0 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
108d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
108e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
108f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
10900 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
10910 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
10920 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
10930 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
10940 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
10950 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
10960 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
10970 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
10980 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
10990 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
109a0 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
109b0 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
109c0 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
109d0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
109e0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
109f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
10a00 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
10a10 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
10a20 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
10a30 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10a40 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10a50 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10a60 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10a70 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10a80 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10a90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10aa0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10ab0 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
10ac0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
10ad0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10ae0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
10af0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
10b00 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
10b10 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
10b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b30 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10b40 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
10b50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10b60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10b70 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
10b80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10b90 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
10ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
10bb0 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
10bc0 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
10bd0 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
10be0 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
10bf0 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
10c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
10c10 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
10c20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10c30 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10c40 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  pVfs, zMaster, n
10c50 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71  eedSync);.    sq
10c60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10c70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
10c80 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
10c90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
10ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10cb0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
10cc0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
10cd0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
10ce0 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
10cf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
10d00 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
10d10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10d20 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
10d30 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
10d40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
10d50 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
10d60 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
10d70 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
10d80 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
10d90 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
10da0 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
10db0 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
10dc0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
10dd0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
10de0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
10df0 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
10e00 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
10e10 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
10e20 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
10e30 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
10e40 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
10e50 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
10e60 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
10e70 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10e80 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
10e90 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
10ea0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
10eb0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
10ec0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
10ed0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10ee0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10ef0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10f00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10f10 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
10f20 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
10f30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10f40 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
10f50 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
10f60 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10f70 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
10f80 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
10f90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
10fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10fb0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
10fc0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
10fd0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
10fe0 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
10ff0 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
11000 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
11010 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
11020 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
11030 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
11040 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
11050 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
11060 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
11070 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
11080 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
11090 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
110a0 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
110b0 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
110c0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
110d0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
110e0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
110f0 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
11100 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
11110 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
11120 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
11130 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
11140 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
11150 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
11160 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
11170 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
11180 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
11190 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
111a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
111b0 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
111c0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
111d0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
111e0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
111f0 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
11200 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
11210 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
11220 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
11230 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
11240 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
11250 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
11260 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
11270 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
11280 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
11290 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
112a0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
112b0 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
112c0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
112d0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
112e0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
112f0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
11300 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
11310 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
11320 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
11330 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
11340 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
11350 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
11360 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
11370 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
11380 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
11390 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
113a0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
113b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
113c0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
113d0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
113e0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
113f0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
11400 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
11410 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
11420 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
11430 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
11440 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
11450 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
11460 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
11470 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
11480 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
11490 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
114a0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
114b0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
114c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
114d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
114e0 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
114f0 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
11500 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
11510 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
11520 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
11530 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
11540 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
11550 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
11560 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
11570 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
11580 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
11590 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
115a0 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
115b0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
115c0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
115d0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
115e0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
115f0 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
11600 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
11610 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
11620 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
11630 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
11640 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
11650 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
11660 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
11670 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
11680 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
11690 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
116a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
116b0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
116c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
116d0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
116e0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
116f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
11700 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
11710 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
11720 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
11730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11740 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11750 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11760 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
11770 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
11780 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11790 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
117a0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
117b0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
117c0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
117d0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
117e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
117f0 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
11800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11810 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
11820 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
11830 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
11840 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
11850 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
11860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
11870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11880 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
11890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
118a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
118b0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
118c0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
118d0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
118e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
118f0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
11900 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
11920 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
11930 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
11940 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
11950 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
11960 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
11970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11990 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
119a0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
119b0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
119c0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
119d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
119e0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
119f0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
11a00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
11a10 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
11a20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
11a30 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
11a40 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
11a50 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
11a60 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
11a70 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
11a80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
11a90 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
11aa0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
11ab0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
11ac0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
11ad0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
11ae0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
11af0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11b00 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
11b10 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
11b20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11b30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11b50 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
11b60 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
11b70 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
11b80 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
11b90 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
11ba0 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
11bb0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
11bc0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
11bd0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
11be0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
11bf0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
11c00 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
11c10 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
11c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11c30 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
11c40 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
11c50 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
11c60 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
11c70 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
11c80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11c90 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
11ca0 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
11cb0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
11cc0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11cd0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
11ce0 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
11cf0 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
11d00 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
11d10 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
11d20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11d30 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
11d40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11d50 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
11d60 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
11d70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11d80 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
11d90 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
11da0 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
11db0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
11dc0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
11dd0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
11de0 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
11df0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
11e00 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
11e10 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
11e20 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
11e30 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
11e40 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
11e50 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  , "FOREIGN KEY c
11e60 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
11e70 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
11e80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
11e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11ea0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
11eb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11ec0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
11ed0 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
11ee0 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
11ef0 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
11f00 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
11f10 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
11f20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
11f30 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
11f40 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
11f50 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
11f60 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
11f70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
11f80 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
11f90 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
11fa0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
11fb0 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
11fc0 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
11fd0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
11fe0 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
11ff0 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
12000 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
12010 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
12020 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
12030 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
12040 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
12050 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
12060 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
12070 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
12080 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
12090 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
120a0 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
120b0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
120c0 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
120d0 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
120e0 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
120f0 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
12100 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12110 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
12120 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
12150 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
12160 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
12170 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
12180 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
12190 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
121a0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
121b0 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
121c0 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
121d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
121e0 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
121f0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
12200 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
12210 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
12220 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
12230 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
12240 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
12250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
12260 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
12270 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
12280 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
12290 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
122a0 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
122b0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
122c0 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
122d0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
122e0 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
122f0 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
12300 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
12310 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
12320 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
12330 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
12340 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
12350 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
12360 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
12370 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
12380 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
12390 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
123a0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
123b0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
123c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
123d0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
123e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  MEM;.  }.  if( p
123f0 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65  ->aOnceFlag ) me
12400 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  mset(p->aOnceFla
12410 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c  g, 0, p->nOnceFl
12420 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  ag);.  closeAllC
12430 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28  ursors(p);.  if(
12440 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
12450 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
12460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12470 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
12480 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
12490 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
124a0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
124b0 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
124c0 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
124d0 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20   or if the.  ** 
124e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f  SQL statement do
124f0 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77  es not read or w
12500 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20  rite a database 
12510 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  file.  */.  if( 
12520 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62  p->pc>=0 && p->b
12530 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  IsReader ){.    
12540 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
12550 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
12560 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
12570 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
12580 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
12590 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
125a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
125b0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
125c0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
125d0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
125e0 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
125f0 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
12600 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12610 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
12620 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
12630 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
12640 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
12650 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
12660 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
12670 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
12680 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
12690 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
126c0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
126d0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
126e0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
126f0 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
12700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
12710 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
12720 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12730 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
12740 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
12750 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
12760 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
12770 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
12780 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
12790 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
127a0 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
127b0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
127c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
127d0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
127e0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
127f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
12800 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
12810 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
12820 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
12830 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
12840 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
12850 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
12860 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
12870 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
12880 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
12890 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
128a0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
128b0 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
128c0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
128d0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
128e0 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
128f0 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
12900 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
12910 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
12920 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
12930 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
12940 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
12950 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
12960 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
12970 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
12980 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
12990 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
129a0 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
129b0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
129c0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
129d0 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
129e0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
129f0 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
12a00 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
12a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
12a20 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
12a30 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
12a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12a50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
12a60 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
12a70 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
12a80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
12a90 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
12aa0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
12ab0 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
12ac0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
12ad0 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
12ae0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
12af0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12b00 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12b10 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12b20 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12b30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12b40 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
12b50 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
12b60 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12b70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   1;.          db
12b80 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  ->bConcurrent = 
12b90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
12ba0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
12bd0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
12be0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
12bf0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
12c00 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12c20 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
12c30 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
12c40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
12c50 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
12c60 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
12c70 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
12c80 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
12c90 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
12ca0 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
12cb0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
12cc0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
12cd0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
12ce0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
12cf0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
12d00 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
12d10 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
12d20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
12d30 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
12d40 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
12d50 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
12d60 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
12d70 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
12d80 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
12d90 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
12da0 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
12db0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
12dc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12dd0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
12de0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
12df0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
12e00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12e10 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
12e20 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
12e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12e50 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
12e60 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
12e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12e80 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
12e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12ea0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
12ed0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12ee0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
12ef0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
12f00 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
12f10 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
12f20 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
12f30 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
12f40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
12f50 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
12f60 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
12f70 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
12f80 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
12f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
12fa0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
12fb0 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
12fc0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
12fd0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
12fe0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
12ff0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
13000 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
13010 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
13020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13030 66 28 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d  f( (rc & 0xFF)==
13040 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
13050 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
13060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13070 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
13080 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13090 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
130a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
130b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
130c0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
130d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
130e0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
130f0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
13100 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
13110 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13120 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
13130 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
13140 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
13150 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13160 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13170 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
13180 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
13190 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
131a0 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
131b0 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
131c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
131d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
131e0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
131f0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
13200 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13210 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13220 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
13230 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
13240 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
13250 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
13260 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13270 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
13280 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
13290 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
132a0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
132b0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
132c0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
132d0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
132e0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
132f0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13300 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13330 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13340 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
13350 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
13360 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
13370 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
13380 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13390 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
133a0 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  ->bConcurrent = 
133b0 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  0;.        p->nC
133c0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
133d0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
133e0 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
133f0 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
13400 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
13410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
13420 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
13430 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13440 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
13450 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
13460 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
13470 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
13480 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
13490 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
134a0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
134b0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
134c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
134d0 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
134e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
134f0 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
13500 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
13510 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
13520 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
13530 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
13540 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
13550 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
13560 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
13570 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
13580 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13590 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
135a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
135b0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
135c0 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
135d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
135e0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
135f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13600 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
13610 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
13620 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
13630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13640 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
13650 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
13660 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
13670 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13680 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
13690 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
136a0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
136b0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
136c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
136d0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
136e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
136f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
13700 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
13710 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
13720 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
13730 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
13740 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
13750 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
13760 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13770 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
13780 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
13790 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
137a0 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
137b0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
137c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
137d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
137e0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
137f0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
13800 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
13810 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13820 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
13830 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
13840 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13850 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
13860 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
13870 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
13880 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
13890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
138a0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
138b0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
138c0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
138d0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
138e0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
138f0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
13900 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
13910 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
13920 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
13930 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
13940 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
13950 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
13960 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
13970 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
13980 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
13990 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
139a0 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
139b0 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
139c0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
139d0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
139e0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
139f0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
13a00 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
13a10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
13a20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13a30 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
13a40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
13a50 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
13a60 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
13a70 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
13a80 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
13a90 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
13aa0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
13ab0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
13ac0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
13ad0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
13ae0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
13af0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
13b00 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
13b10 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
13b20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
13b30 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
13b40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
13b50 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
13b60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
13b70 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
13b80 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
13b90 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
13ba0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
13bb0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
13bc0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
13bd0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
13be0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
13bf0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
13c00 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
13c10 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
13c20 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
13c30 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
13c40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
13c50 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
13c60 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
13c70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13c80 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
13c90 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
13ca0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
13cb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
13cc0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13cd0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
13ce0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
13cf0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
13d00 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
13d10 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
13d20 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
13d30 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
13d40 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
13d50 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
13d60 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
13d70 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
13d80 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
13d90 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
13da0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
13db0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
13dc0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
13dd0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
13de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
13df0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
13e00 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
13e10 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
13e20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13e30 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
13e40 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
13e50 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
13e60 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
13e70 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
13e80 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
13e90 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
13ea0 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
13eb0 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
13ec0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
13ed0 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
13ee0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
13ef0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
13f00 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
13f10 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
13f20 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
13f30 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
13f40 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
13f50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
13f60 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
13f70 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
13f80 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
13f90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
13fa0 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
13fb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13fc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13fd0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
13fe0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
13ff0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
14000 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
14010 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
14020 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
14030 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
14040 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
14050 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
14060 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
14070 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
14080 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
14090 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
140a0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
140b0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
140c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
140d0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
140e0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
140f0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
14100 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
14110 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
14120 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
14130 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
14140 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14150 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
14160 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
14170 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
14180 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14190 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
141a0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
141b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
141c0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
141d0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
141e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
141f0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
14200 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
14210 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
14220 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
14230 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
14240 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
14250 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
14260 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
14270 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
14280 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
14290 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
142a0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
142b0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
142c0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
142d0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
142e0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
142f0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
14300 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
14310 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
14320 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
14330 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
14340 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
14350 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
14360 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
14370 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
14380 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
14390 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
143a0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
143b0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
143c0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
143d0 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
143e0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
143f0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
14400 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
14410 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
14420 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
14430 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
14440 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
14450 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
14460 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
14470 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
14480 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
14490 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
144a0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
144b0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
144c0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
144d0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
144e0 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
144f0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
14500 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
14510 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
14520 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
14530 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
14540 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
14550 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
14560 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
14570 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
14580 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
14590 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
145a0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
145b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
145c0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
145d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
145e0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
145f0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
14600 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
14610 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
14620 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
14630 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
14640 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
14650 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
14660 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
14670 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
14680 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
14690 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
146a0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
146b0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
146c0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
146d0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
146e0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
146f0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
14700 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
14710 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
14720 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
14730 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
14740 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
14750 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
14760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14770 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
14780 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
14790 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
147a0 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
147b0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
147c0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
147d0 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
147e0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
147f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
14800 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
14810 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
14820 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
14830 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
14840 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
14850 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
14860 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
14870 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
14880 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
14890 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
148a0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
148b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
148c0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
148d0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
148e0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
148f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
14900 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
14910 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
14920 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
14930 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
14940 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
14950 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14960 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
14970 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
14980 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
14990 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
149a0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
149b0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
149c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
149d0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
149e0 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
149f0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
14a00 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
14a10 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
14a20 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
14a30 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
14a40 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
14a50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14a60 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
14a70 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
14a80 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
14a90 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
14aa0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
14ab0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
14ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
14ad0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
14ae0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
14af0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
14b00 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
14b10 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14b20 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
14b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14b40 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
14b50 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
14b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
14b70 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
14b80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
14b90 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
14ba0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
14bb0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
14bc0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
14bd0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
14be0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
14bf0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
14c00 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
14c10 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
14c20 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
14c30 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
14c40 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
14c50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
14c60 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
14c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14c80 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
14c90 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
14ca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14cb0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
14cc0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
14cd0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
14ce0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
14cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14d00 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
14d10 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
14d20 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
14d30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14d40 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
14d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14d60 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
14d70 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
14d80 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
14d90 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
14da0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
14db0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
14dc0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
14dd0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
14de0 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
14df0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
14e00 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
14e10 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
14e20 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
14e30 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
14e40 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
14e50 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
14e60 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
14e70 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
14e80 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
14e90 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
14ea0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
14eb0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
14ec0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
14ed0 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
14ee0 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
14ef0 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
14f00 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
14f10 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
14f20 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
14f30 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
14f40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
14f50 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
14f60 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
14f70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
14f80 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
14f90 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
14fa0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
14fb0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
14fc0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
14fd0 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
14fe0 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
14ff0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15000 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
15010 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
15020 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
15030 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
15040 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
15050 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
15060 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
15070 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
15080 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
15090 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
150a0 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
150b0 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
150c0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
150d0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
150e0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
150f0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
15100 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
15110 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
15120 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
15130 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
15140 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
15150 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
15160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15170 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
15180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15190 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
151a0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
151b0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
151c0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
151d0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
151e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
151f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
15200 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
15210 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
15220 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
15230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
15240 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
15250 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
15260 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15270 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
15280 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
15290 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
152a0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
152b0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
152c0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
152d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
152e0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
152f0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
15300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15310 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
15320 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
15330 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
15340 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
15350 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
15360 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
15370 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
15380 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
15390 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
153a0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
153b0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
153c0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
153d0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
153e0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
153f0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
15400 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
15410 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
15420 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
15430 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
15440 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
15450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15460 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
15470 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
15480 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
15490 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
154a0 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
154b0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
154c0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
154d0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
154e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
154f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
15500 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
15510 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
15520 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
15530 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
15540 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
15550 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
15560 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
15570 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
15580 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
15590 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
155a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
155b0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
155c0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
155d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
155e0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
155f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
15600 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
15610 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
15620 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
15630 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
15640 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
15650 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15660 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
15670 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15680 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
15690 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
156a0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
156b0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
156c0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
156d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
156e0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
156f0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
15700 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
15710 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
15720 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
15730 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
15740 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15750 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
15760 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
15770 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
15780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
15790 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
157a0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
157b0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
157c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
157d0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
157e0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
157f0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
15800 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
15810 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
15820 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
15830 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
15840 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
15850 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
15860 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
15870 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
15880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
15890 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
158a0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
158b0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
158c0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
158d0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
158e0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
158f0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
15900 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
15910 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
15920 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
15930 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
15940 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15950 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
15960 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15970 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
15980 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15990 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
159a0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
159b0 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
159c0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
159d0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
159e0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
159f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
15a10 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
15a20 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
15a30 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
15a40 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
15a50 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
15a60 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
15a70 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
15a80 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
15a90 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
15aa0 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
15ab0 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
15ac0 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
15ad0 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
15ae0 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
15af0 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
15b00 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
15b10 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
15b20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
15b30 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
15b40 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
15b50 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
15b60 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
15b70 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
15b80 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
15b90 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
15ba0 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
15bb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75    assert( p->pCu
15bc0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
15bd0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
15be0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
15bf0 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->pCursor) );. 
15c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
15c10 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
15c20 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  p->pCursor, &isD
15c30 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
15c40 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
15c50 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
15c60 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
15c70 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
15c80 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
15c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
15ca0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
15cb0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
15cc0 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
15cd0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
15ce0 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
15cf0 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
15d00 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
15d10 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
15d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
15d30 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
15d40 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
15d50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
15d60 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
15d70 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
15d80 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
15d90 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
15da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15db0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
15dc0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
15dd0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
15de0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
15df0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
15e00 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
15e10 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
15e20 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
15e30 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
15e40 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
15e50 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
15e60 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
15e70 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
15e80 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
15e90 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
15ea0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
15eb0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
15ec0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
15ed0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
15ee0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
15ef0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
15f00 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
15f10 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
15f20 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
15f30 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
15f40 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
15f50 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
15f60 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
15f70 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
15f80 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
15f90 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
15fa0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
15fb0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
15fc0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
15fd0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
15fe0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
15ff0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
16000 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16010 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
16020 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
16030 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
16040 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
16050 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eto ){.    retur
16060 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
16070 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20  Moveto(p);.  }. 
16080 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20   if( p->pCursor 
16090 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  && sqlite3BtreeC
160a0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
160b0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
160c0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
160d0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
160e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
160f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16100 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
16110 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
16120 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16130 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
16140 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16150 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
16160 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
16170 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16180 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
16190 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
161a0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
161b0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
161c0 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
161d0 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
161e0 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
161f0 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
16200 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
16210 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
16220 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
16230 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
16240 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
16250 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
16260 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
16270 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
16280 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
16290 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
162a0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
162b0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
162c0 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
162d0 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
162e0 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
162f0 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
16300 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
16310 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
16320 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
16330 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
16340 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16350 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
16360 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
16370 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
16380 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
16390 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
163a0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
163b0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
163c0 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
163d0 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
163e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
163f0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
16400 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
16410 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
16420 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
16430 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
16440 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
16450 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
16470 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16480 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16490 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
164c0 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
164f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
16500 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
16510 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
16520 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
16530 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
16540 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
16550 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
16560 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
16570 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
165a0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
165b0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
165c0 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
165d0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
165e0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
16610 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
16620 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
16640 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
16650 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
16680 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
16690 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
166c0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
166d0 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
16700 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
16710 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
16720 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
16730 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
16740 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
16750 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
16760 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
16770 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
16780 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
16790 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
167a0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
167b0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
167c0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
167d0 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
167e0 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
167f0 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
16800 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
16810 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
16820 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
16830 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
16840 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16850 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
16860 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
16870 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
16880 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e  ->flags;.  u32 n
16890 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
168a0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
168b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
168c0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
168d0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
168e0 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
168f0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
16900 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
16910 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
16920 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
16930 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
16940 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
16950 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
16960 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
16970 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
16980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16990 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
169a0 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
169b0 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26       return ((i&
169c0 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
169d0 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33  rmat>=4) ? 8+(u3
169e0 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  2)u : 1;.    }. 
169f0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
16a00 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
16a10 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
16a20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
16a30 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
16a40 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
16a50 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
16a60 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
16a70 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
16a80 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
16a90 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
16aa0 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
16ab0 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
16ac0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
16ad0 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
16ae0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
16af0 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
16b00 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
16b10 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
16b20 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
16b30 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
16b40 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65  .nZero;.  }.  re
16b50 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
16b60 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
16b70 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
16b80 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
16b90 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
16ba0 73 73 20 74 68 61 6e 20 31 32 0a 2a 2f 0a 73 74  ss than 12.*/.st
16bb0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71  atic const u8 sq
16bc0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
16bd0 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 30 2c 20 31  zes[] = {.  0, 1
16be0 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
16bf0 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 7d   8, 0, 0, 0, 0.}
16c00 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
16c10 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
16c20 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
16c30 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
16c40 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
16c50 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
16c60 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16c70 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
16c80 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
16c90 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
16ca0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
16cb0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
16cc0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
16cd0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
16ce0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
16cf0 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
16d00 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
16d10 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
16d20 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
16d30 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
16d40 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
16d50 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
16d60 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
16d70 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
16d80 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
16d90 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
16da0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
16db0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
16dc0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
16dd0 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
16de0 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
16df0 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
16e00 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
16e10 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
16e20 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
16e30 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
16e40 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
16e50 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
16e60 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
16e70 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
16e80 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
16e90 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
16ea0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
16eb0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
16ec0 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
16ed0 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
16ee0 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
16ef0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
16f00 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
16f10 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
16f20 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
16f30 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
16f40 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
16f50 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
16f60 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
16f70 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
16f80 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
16f90 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
16fa0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
16fb0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
16fc0 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
16fd0 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
16fe0 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
16ff0 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
17000 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
17010 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
17020 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
17030 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
17040 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
17050 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
17060 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
17070 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
17080 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
17090 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
170a0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
170b0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
170c0 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
170d0 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
170e0 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
170f0 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
17100 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
17110 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
17120 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
17130 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
17140 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
17150 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
17160 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
17170 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
17180 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
17190 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
171a0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
171b0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
171c0 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
171d0 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
171e0 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
171f0 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
17200 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
17210 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
17220 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
17230 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
17240 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
17250 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
17260 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
17270 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
17280 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
17290 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
172a0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
172b0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
172c0 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
172d0 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
172e0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
172f0 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
17300 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
17310 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
17320 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
17330 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
17340 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
17350 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
17360 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
17370 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
17380 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
17390 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
173a0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
173b0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
173c0 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
173d0 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
173e0 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
173f0 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
17400 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
17410 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
17420 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
17430 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
17440 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
17450 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
17460 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
17470 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
17480 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
17490 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
174a0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
174b0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
174c0 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
174d0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
174e0 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
174f0 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
17500 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
17510 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
17520 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
17530 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
17540 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17550 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
17560 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
17570 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
17580 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
17590 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
175a0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
175b0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
175c0 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
175d0 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
175e0 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
175f0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
17600 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
17610 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
17620 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
17630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17640 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
17650 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
17660 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
17670 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
17680 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
17690 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
176a0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
176b0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
176c0 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
176d0 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
176e0 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
176f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17700 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
17710 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
17720 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
17730 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
17740 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
17750 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
17760 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
17770 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
17780 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
17790 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
177a0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
177b0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
177c0 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
177d0 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
177e0 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
177f0 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
17800 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
17810 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
17820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17830 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
17840 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
17850 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
17860 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
17870 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
17880 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
17890 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
178a0 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
178b0 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
178c0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
178d0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
178e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
178f0 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
17900 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
17910 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
17920 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
17930 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
17940 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
17950 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
17960 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
17970 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17980 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
17990 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
179a0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
179b0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
179c0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
179d0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
179e0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
179f0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
17a00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
17a10 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
17a20 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
17a30 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
17a40 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
17a50 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
17a60 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
17a70 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
17a80 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
17a90 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
17aa0 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
17ab0 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
17ac0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
17ad0 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
17ae0 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
17af0 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
17b00 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
17b10 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
17b20 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
17b30 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
17b40 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
17b50 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
17b60 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
17b70 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
17b80 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
17b90 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
17ba0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
17bb0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
17bc0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
17bd0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
17be0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
17bf0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
17c00 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
17c10 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
17c20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
17c30 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
17c40 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17c50 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
17c60 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
17c70 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
17c80 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
17c90 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
17ca0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
17cb0 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
17cc0 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
17cd0 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
17ce0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
17cf0 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
17d00 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
17d10 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
17d20 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
17d30 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
17d40 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
17d50 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
17d60 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
17d70 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
17d80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
17d90 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
17da0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
17db0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
17dc0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17de0 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
17df0 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
17e00 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e20 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
17e30 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
17e40 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
17e50 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
17e60 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
17e70 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
17e80 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
17e90 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
17ea0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
17eb0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
17ec0 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
17ed0 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
17ee0 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
17ef0 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
17f00 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
17f10 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
17f20 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
17f30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17f40 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
17f50 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17f60 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
17f70 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
17f80 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
17f90 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
17fa0 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
17fb0 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
17fc0 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
17fd0 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
17fe0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
17ff0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
18000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
18010 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
18020 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
18030 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
18040 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
18050 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
18060 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
18070 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
18080 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
18090 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
180a0 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
180b0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
180c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
180d0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
180e0 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
180f0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
18100 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
18110 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
18120 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
18130 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
18140 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
18150 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
18160 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
18170 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
18180 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
18190 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
181a0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
181b0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
181c0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
181d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
181e0 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
181f0 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
18200 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
18210 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
18220 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
18230 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
18240 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
18250 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
18260 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
18270 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
18280 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
18290 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
182a0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
182b0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
182c0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
182d0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
182e0 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
182f0 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
18300 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
18310 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
18320 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
18330 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18350 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
18360 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
18370 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
18380 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
18390 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
183a0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
183b0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
183c0 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
183d0 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
183e0 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
183f0 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
18400 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
18410 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18420 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
18430 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
18440 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18450 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
18460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18470 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
18480 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18490 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
184a0 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
184b0 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
184c0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
184d0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
184e0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
184f0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
18500 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
18510 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
18520 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
18530 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
18540 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18550 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
18560 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
18570 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
18580 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18590 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
185a0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
185b0 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
185c0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
185d0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
185e0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
185f0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
18600 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
18610 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
18620 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
18630 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
18640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18650 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
18660 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
18670 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
18680 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
18690 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
186a0 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
186b0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
186c0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
186d0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
186e0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
186f0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
18700 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
18710 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
18720 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
18730 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
18740 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
18750 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
18760 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
18770 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
18780 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
18790 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
187a0 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
187b0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
187c0 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
187d0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
187e0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
187f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
18800 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
18810 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
18820 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
18830 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
18840 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
18850 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
18860 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
18870 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
18880 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
18890 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
188a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
188b0 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
188c0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
188d0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
188e0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
188f0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
18900 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
18910 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
18920 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
18930 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
18940 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
18950 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
18960 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
18970 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
18980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
18990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
189a0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
189b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
189c0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
189d0 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
189e0 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
189f0 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
18a00 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
18a10 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
18a20 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
18a30 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
18a40 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
18a50 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
18a60 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
18a70 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
18a80 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
18a90 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
18aa0 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
18ab0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
18ac0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
18ad0 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
18ae0 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
18af0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18b00 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
18b10 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
18b20 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
18b30 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18b40 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
18b50 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
18b60 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
18b70 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
18b80 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
18b90 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
18ba0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
18bb0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
18bc0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
18bd0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18be0 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
18bf0 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
18c00 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
18c10 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
18c20 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
18c30 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
18c40 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
18c50 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
18c60 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
18c70 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
18c80 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
18c90 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
18ca0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
18cb0 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
18cc0 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
18cd0 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
18ce0 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
18cf0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
18d00 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
18d10 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
18d20 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
18d30 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18d40 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
18d50 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
18d60 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
18d70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
18d80 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
18d90 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
18da0 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
18db0 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
18dc0 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
18dd0 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
18de0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
18df0 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
18e00 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
18e10 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
18e20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
18e30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
18e40 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
18e50 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
18e60 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
18e70 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
18e80 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
18e90 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
18ea0 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
18eb0 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
18ec0 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
18ed0 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
18ee0 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
18ef0 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
18f00 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
18f10 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
18f20 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
18f30 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
18f40 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
18f50 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
18f60 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
18f70 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
18f80 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
18f90 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
18fa0 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
18fb0 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
18fc0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
18fd0 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
18fe0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
18ff0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
19000 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
19010 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
19020 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
19030 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
19040 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
19050 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19060 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
19070 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
19080 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
19090 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
190c0 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
190d0 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
190e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
190f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
19100 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
19110 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
19120 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
19130 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
19140 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65  aller should fre
19150 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a  e this pointer *
19160 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
19170 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
19180 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
19190 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
191a0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66  urn */.  int nOf
191b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
191c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
191d0 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20  ement pSpace by 
191e0 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74  nOff to align it
191f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19220 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
19230 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f  d for *p */..  /
19240 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
19250 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
19260 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
19270 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
19280 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
19290 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
192a0 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
192b0 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
192c0 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
192d0 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
192e0 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
192f0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
19300 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
19310 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
19320 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
19330 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
19340 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
19350 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  7;.  nByte = ROU
19360 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
19370 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
19380 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
19390 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
193a0 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
193b0 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20  ace+nOff ){.    
193c0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
193d0 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
193e0 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
193f0 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
19400 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68     *ppFree = (ch
19410 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20  ar *)p;.    if( 
19420 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
19430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
19440 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
19450 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a  )&pSpace[nOff];.
19460 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b      *ppFree = 0;
19470 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20  .  }..  p->aMem 
19480 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
19490 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
194a0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
194b0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ))];.  assert( p
194c0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
194d0 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70  der!=0 );.  p->p
194e0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
194f0 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
19500 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
19510 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e  ld + 1;.  return
19520 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
19530 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
19540 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
19550 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
19560 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a   populate the .*
19570 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  * UnpackedRecord
19580 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
19590 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72  ated by the four
195a0 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  th argument with
195b0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
195c0 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20   of the decoded 
195d0 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64  record..*/ .void
195e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
195f0 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
19600 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
19610 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
19620 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
19630 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
19640 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
19650 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19660 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
19670 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
19680 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
19690 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
196a0 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
196b0 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20  dRecord *p      
196c0 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
196d0 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72   structure befor
196e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a  e returning. */.
196f0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
19700 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
19710 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
19720 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20   char *)pKey;.  
19730 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64  int d; .  u32 id
19740 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
19750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
19760 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f  set in aKey[] to
19770 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
19780 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
197b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
197c0 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
197d0 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  pMem = p->aMem;.
197e0 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63  .  p->default_rc
197f0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
19800 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
19810 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
19820 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
19830 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
19840 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
19850 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
19860 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e  dx<szHdr && d<=n
19870 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73  Key ){.    u32 s
19880 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
19890 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
198a0 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
198b0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
198c0 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
198d0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
198e0 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
198f0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a  Info->db;.    /*
19900 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
19910 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65  ; // sqlite3Vdbe
19920 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c  SerialGet() will
19930 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73   set this for us
19940 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   */.    pMem->sz
19950 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
19960 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
19970 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
19980 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
19990 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
199a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
199b0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
199c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
199d0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
199e0 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
199f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
19a00 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
19a10 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
19a20 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
19a30 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
19a40 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
19a50 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
19a60 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
19a70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
19a80 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
19a90 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
19aa0 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
19ab0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
19ac0 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
19ad0 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
19ae0 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
19af0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
19b00 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
19b10 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
19b20 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
19b30 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
19b40 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
19b50 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
19b60 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
19b70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
19b80 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
19b90 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
19ba0 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
19bb0 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
19bc0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
19bd0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
19be0 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
19bf0 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
19c00 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
19c10 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
19c20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
19c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
19c40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
19c50 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
19c60 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
19c70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
19c80 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
19c90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
19ca0 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
19cb0 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
19cc0 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
19cd0 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
19ce0 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
19cf0 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
19d00 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
19d10 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
19d20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
19d30 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
19d40 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
19d50 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
19d60 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
19d70 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
19d80 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
19d90 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
19da0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
19db0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
19dc0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
19dd0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
19de0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
19df0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
19e00 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
19e10 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
19e20 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
19e30 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
19e40 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
19e50 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
19e60 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
19e70 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
19e80 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
19e90 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
19ea0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
19eb0 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
19ec0 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
19ed0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
19ee0 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
19ef0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
19f00 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
19f10 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
19f20 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
19f30 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
19f40 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
19f50 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
19f60 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
19f70 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
19f80 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
19f90 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
19fa0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
19fb0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
19fc0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
19fd0 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
19fe0 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
19ff0 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1a000 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1a010 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1a020 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1a030 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1a040 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1a050 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1a060 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1a070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a080 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1a090 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1a0a0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1a0b0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1a0c0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1a0d0 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1a0e0 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1a0f0 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1a100 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1a110 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1a120 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1a130 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1a140 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1a150 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1a160 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1a170 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1a180 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a190 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1a1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1a1b0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1a1c0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1a1d0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1a1e0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1a1f0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1a200 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1a210 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a220 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1a230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1a240 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1a250 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1a260 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1a270 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1a280 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1a290 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1a2a0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1a2b0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1a2c0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1a2d0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1a2e0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1a2f0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1a300 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1a310 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1a320 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1a330 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1a340 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1a350 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1a360 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1a370 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1a380 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1a390 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1a3a0 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1a3b0 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1a3c0 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1a3d0 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1a3e0 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1a3f0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1a400 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1a410 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1a420 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1a430 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1a440 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1a450 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1a460 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1a470 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1a480 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1a490 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1a4a0 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1a4b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a4c0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1a4d0 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1a4e0 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1a4f0 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1a500 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1a510 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1a520 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1a530 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1a540 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1a550 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1a560 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1a570 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1a580 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1a590 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1a5a0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1a5b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1a5c0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1a5d0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1a5e0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1a5f0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1a600 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1a610 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1a620 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1a630 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1a640 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1a650 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1a660 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1a670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1a680 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1a690 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1a6a0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1a6b0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1a6c0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1a6d0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1a6e0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1a6f0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1a700 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1a710 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1a720 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1a730 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1a740 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1a750 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1a760 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1a770 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1a780 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1a790 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1a7a0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1a7b0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1a7c0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1a7d0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1a7e0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1a7f0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1a800 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1a810 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1a820 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1a830 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1a840 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1a850 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1a860 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1a870 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1a880 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1a890 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1a8a0 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1a8b0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1a8c0 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1a8d0 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1a8e0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1a8f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1a900 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1a910 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a920 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1a930 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1a940 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1a950 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1a960 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1a970 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1a980 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1a990 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1a9a0 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1a9b0 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1a9c0 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1a9d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1a9e0 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1a9f0 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1aa00 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1aa10 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1aa20 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1aa30 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1aa40 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1aa50 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1aa60 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1aa70 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1aa80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1aa90 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1aaa0 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1aab0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1aac0 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1aad0 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1aae0 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1aaf0 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1ab00 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1ab10 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1ab20 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1ab30 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1ab40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ab50 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1ab60 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1ab70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1ab80 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1ab90 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1aba0 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1abb0 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1abc0 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1abd0 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1abe0 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1abf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1ac00 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1ac10 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1ac20 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1ac30 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1ac40 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1ac50 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ac60 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1ac70 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1ac80 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1ac90 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1aca0 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1acb0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1acc0 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1acd0 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1ace0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1acf0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1ad00 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1ad10 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1ad20 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1ad30 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1ad40 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1ad50 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1ad60 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1ad70 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1ad80 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1ad90 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1ada0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1adb0 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1adc0 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1add0 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1ade0 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1adf0 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1ae00 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1ae10 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1ae20 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1ae30 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1ae40 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1ae50 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1ae60 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1ae70 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1ae80 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1ae90 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1aea0 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1aeb0 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1aec0 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1aed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1aee0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1aef0 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1af00 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1af10 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1af20 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1af30 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1af60 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1af70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1af80 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1af90 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1afa0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1afb0 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1afc0 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1afd0 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1afe0 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1aff0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1b000 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1b010 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1b020 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1b030 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1b040 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1b050 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1b060 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1b070 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1b080 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1b090 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1b0a0 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1b0b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1b0c0 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1b0d0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1b0e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1b0f0 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1b100 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1b110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b120 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1b130 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1b140 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1b150 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1b160 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1b170 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1b180 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1b190 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1b1a0 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1b1b0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1b1c0 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1b1d0 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1b1e0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1b1f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1b200 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1b210 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1b220 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1b230 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1b240 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1b250 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1b260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1b270 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1b280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1b290 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1b2a0 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1b2b0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1b2c0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1b2d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1b2f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1b300 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1b310 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1b320 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1b330 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1b340 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1b350 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1b360 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1b370 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1b380 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1b390 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1b3a0 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1b3b0 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1b3c0 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1b3d0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1b3e0 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1b3f0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1b400 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1b410 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1b420 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  nt c = memcmp(pB
1b430 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42  1->z, pB2->z, pB
1b440 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42  1->n>pB2->n ? pB
1b450 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a  2->n : pB1->n);.
1b460 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1b470 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31   c;.  return pB1
1b480 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a  ->n - pB2->n;.}.
1b490 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1b4a0 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1b4b0 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1b4c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1b4d0 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1b4e0 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1b4f0 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1b500 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1b510 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1b520 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1b530 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1b540 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1b550 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1b560 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1b570 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1b580 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1b590 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1b5a0 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1b5b0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1b5c0 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1b5d0 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1b5e0 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1b5f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1b600 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1b610 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1b620 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1b630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1b640 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1b650 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1b660 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1b670 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1b680 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1b690 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1b6a0 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1b6b0 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1b6c0 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1b6d0 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1b6e0 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1b6f0 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1b700 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1b710 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1b720 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1b730 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1b740 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1b750 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1b760 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1b770 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1b780 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1b790 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1b7a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1b7b0 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1b7c0 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1b7d0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1b7e0 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61  ue is a number a
1b7f0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1b800 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  not, the number 
1b810 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1b820 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72   both are number
1b830 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65  s, compare as re
1b840 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20  als if one is a 
1b850 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65  real, or as inte
1b860 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74  gers.  ** if bot
1b870 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74  h values are int
1b880 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  egers..  */.  if
1b890 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b8a0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1b8b0 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  al) ){.    doubl
1b8c0 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66  e r1, r2;.    if
1b8d0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1b8e0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1b8f0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1b900 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1b910 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1b920 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1b930 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1b940 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72  eturn 1;.      r
1b950 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1b960 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1b970 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1b980 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72   r1 = pMem1->u.r
1b990 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b9a0 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
1b9b0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64  ){.      r1 = (d
1b9c0 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69  ouble)pMem1->u.i
1b9d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b9e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1b9f0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d   }.    if( (f2&M
1ba00 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1ba10 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d       r2 = pMem2-
1ba20 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >u.r;.    }else 
1ba30 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
1ba40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
1ba50 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d  = (double)pMem2-
1ba60 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >u.i;.    }else{
1ba70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1ba80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ba90 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d  r1<r2 ) return -
1baa0 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32  1;.    if( r1>r2
1bab0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1bac0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1bad0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1bae0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1baf0 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1bb00 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1bb10 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1bb20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1bb30 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1bb40 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1bb50 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1bb60 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1bb70 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1bb80 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1bb90 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1bba0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1bbb0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1bbc0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1bbd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1bbe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1bbf0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1bc00 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20  =pMem2->enc );. 
1bc10 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1bc20 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1bc30 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1bc40 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1bc50 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1bc60 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1bc70 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1bc80 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1bc90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1bca0 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1bcb0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1bcc0 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1bcd0 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1bce0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1bcf0 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1bd00 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1bd10 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1bd20 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1bd30 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1bd40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1bd50 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1bd60 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1bd70 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1bd80 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1bd90 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1bda0 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1bdb0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1bdc0 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1bdd0 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1bde0 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1bdf0 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1be00 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1be10 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1be20 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1be30 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1be40 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1be50 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1be60 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1be70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1be80 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1be90 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1bea0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1beb0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1bec0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1bed0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1bee0 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1bef0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1bf00 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1bf10 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1bf20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1bf30 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1bf40 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1bf50 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1bf60 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1bf70 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1bf80 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1bf90 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1bfa0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1bfb0 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1bfc0 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1bfd0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1bfe0 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1bff0 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1c000 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1c010 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1c020 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1c030 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1c040 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1c050 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1c060 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1c070 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1c080 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1c090 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1c0a0 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1c0b0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1c0c0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c0d0 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1c0e0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1c0f0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1c100 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1c110 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1c120 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1c130 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1c140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1c150 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1c160 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1c170 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1c180 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1c190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c1a0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1c1b0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1c1c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1c1d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1c1e0 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1c1f0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1c200 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c210 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1c220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1c230 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1c240 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1c250 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1c260 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1c270 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1c280 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1c290 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1c2a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c2b0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1c2c0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1c2d0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1c2e0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1c2f0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1c300 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1c310 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1c320 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1c330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c340 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1c350 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1c360 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1c370 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1c380 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1c390 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1c3a0 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1c3b0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1c3c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1c3d0 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1c3e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1c3f0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1c400 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1c410 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1c420 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1c430 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1c440 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1c450 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1c460 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1c470 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1c480 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1c490 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1c4a0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1c4b0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1c4c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1c4d0 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1c4e0 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1c4f0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1c500 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1c510 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1c520 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1c530 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1c540 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1c550 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1c560 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1c570 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1c580 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1c590 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1c5a0 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1c5b0 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1c5c0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1c5d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1c5e0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1c5f0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1c600 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1c610 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1c620 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1c630 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1c640 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1c650 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1c660 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1c670 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1c680 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1c690 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1c6a0 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1c6b0 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1c6c0 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1c6d0 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1c6e0 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1c6f0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1c700 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1c710 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c720 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1c730 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1c740 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1c750 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1c760 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1c770 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1c780 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1c790 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7b0 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1c7c0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1c7d0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c800 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1c810 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1c820 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1c850 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1c860 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1c870 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c890 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1c8a0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1c8b0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c8e0 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1c8f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1c900 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c920 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1c930 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1c940 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1c950 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1c960 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1c970 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1c980 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1c990 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1c9a0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1c9b0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1c9c0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c9d0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1c9e0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1c9f0 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1ca00 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1ca10 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1ca20 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1ca30 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1ca40 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1ca50 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1ca60 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1ca70 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1ca80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1ca90 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1caa0 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1cab0 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1cac0 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1cad0 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1cae0 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1caf0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1cb00 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1cb10 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1cb20 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1cb30 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1cb40 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1cb50 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1cb60 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1cb70 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1cb80 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1cb90 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1cba0 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1cbb0 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1cbc0 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1cbd0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1cbe0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1cbf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1cc00 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1cc10 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1cc20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1cc30 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1cc40 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1cc50 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1cc60 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1cc70 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1cc80 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1cc90 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1cca0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1ccb0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1ccc0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1ccd0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1cce0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1ccf0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1cd00 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1cd10 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1cd20 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1cd30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1cd40 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1cd50 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1cd60 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1cd70 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1cd80 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1cd90 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1cda0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1cdb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1cdc0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1cdd0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1cde0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1cdf0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1ce00 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1ce10 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
1ce20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1ce30 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1ce40 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1ce50 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1ce60 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1ce70 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1ce80 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1ce90 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e  = (double)pRhs->
1cea0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  u.i;.        sql
1ceb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1cec0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1ced0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1cee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1cef0 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20  em1.u.r<rhs ){. 
1cf00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1cf10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1cf20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73  if( mem1.u.r>rhs
1cf30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1cf40 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1cf50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cf60 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1cf70 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1cf80 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1cf90 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1cfa0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1cfb0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1cfc0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1cfd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1cfe0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1cff0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1d000 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1d010 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1d020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1d030 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1d040 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1d050 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1d060 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1d070 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1d080 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1d090 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1d0a0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1d0b0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1d0c0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1d0d0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1d0e0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1d0f0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1d100 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1d110 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1d120 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1d130 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1d140 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1d150 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1d160 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1d170 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1d180 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1d190 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1d1a0 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1d1b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1d1c0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1d1d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1d1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1d1f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1d200 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1d210 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  le rhs = pRhs->u
1d220 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  .r;.        doub
1d230 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  le lhs;.        
1d240 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1d250 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1d260 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1d270 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1d280 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1d290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68   ){.          lh
1d2a0 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20  s = mem1.u.r;.  
1d2b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d2c0 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f         lhs = (do
1d2d0 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20  uble)mem1.u.i;. 
1d2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d2f0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1d300 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1d310 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1d320 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1d330 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1d340 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1d350 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d360 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1d370 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1d380 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1d390 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1d3a0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1d3b0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1d3c0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1d3d0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1d3e0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1d3f0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1d400 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1d410 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1d420 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1d430 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1d440 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d450 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1d460 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1d470 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1d480 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1d490 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1d4a0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1d4b0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1d4c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1d4d0 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1d4e0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1d4f0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1d500 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1d510 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1d520 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1d530 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1d540 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d550 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1d560 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d570 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1d580 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1d590 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1d5a0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1d5b0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1d5c0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1d5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1d5e0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1d5f0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1d600 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1d610 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1d620 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1d630 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1d640 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1d650 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1d670 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1d680 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1d690 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1d6a0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1d6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d6c0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1d6d0 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1d6e0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1d6f0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1d700 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1d710 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1d720 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1d730 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1d740 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1d750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d760 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1d770 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1d780 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1d790 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1d7a0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1d7b0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1d7c0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1d7d0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1d7e0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1d7f0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1d800 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1d810 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1d820 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d830 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1d840 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1d850 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1d860 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1d870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1d880 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1d890 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1d8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1d8b0 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1d8c0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1d8d0 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1d8e0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1d8f0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1d900 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1d910 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1d920 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1d940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d950 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1d960 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1d970 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1d980 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1d990 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1d9a0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1d9b0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1d9c0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1d9d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1d9e0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1d9f0 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1da00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1da10 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1da20 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1da30 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1da40 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1da50 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1da60 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1da70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1da80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1da90 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1daa0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1dab0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1dac0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1dad0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1dae0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1daf0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1db00 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1db10 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1db20 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1db30 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1db40 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1db50 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1db60 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1db70 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1db80 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1db90 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1dba0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1dbb0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1dbc0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1dbd0 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1dbe0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1dbf0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1dc00 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1dc10 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1dc20 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1dc30 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1dc40 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1dc50 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1dc60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1dc70 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1dc80 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1dc90 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1dca0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1dcb0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1dcc0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1dcd0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1dce0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1dcf0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1dd00 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1dd10 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1dd20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1dd30 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1dd40 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1dd50 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1dd60 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1dd70 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1dd80 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1dd90 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1dda0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1ddb0 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1ddc0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1ddd0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1dde0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1ddf0 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1de00 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1de10 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1de20 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1de30 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1de40 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1de50 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1de60 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1de70 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1de80 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1de90 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1dea0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1deb0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1dec0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1ded0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
1dee0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1def0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1df00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1df10 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1df20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1df30 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1df40 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1df50 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1df60 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1df70 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1df80 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1df90 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1dfa0 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1dfb0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1dfc0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1dfd0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1dfe0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1dff0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1e000 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1e010 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1e020 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1e030 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1e040 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1e050 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1e060 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1e070 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1e080 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1e090 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1e0a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e0b0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1e0c0 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1e0d0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1e0e0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1e0f0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1e100 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1e110 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1e120 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
1e130 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1e140 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1e150 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1e160 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1e170 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1e180 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1e190 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1e1a0 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1e1b0 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1e1c0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1e1d0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
1e1e0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1e1f0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1e200 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e210 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
1e220 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
1e230 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
1e240 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1e250 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1e260 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1e270 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
1e280 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1e290 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1e2a0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1e2b0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1e2c0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1e2d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e2e0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1e2f0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1e300 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1e310 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
1e320 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e330 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1e340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e350 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1e360 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1e370 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1e380 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
1e390 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1e3a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e3b0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1e3c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e3d0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1e3e0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1e3f0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
1e400 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1e410 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
1e420 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
1e430 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
1e440 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1e450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e460 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1e470 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1e480 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1e490 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
1e4a0 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1e4b0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1e4c0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1e4d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e4e0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1e4f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e500 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
1e510 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1e520 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
1e530 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1e540 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
1e550 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1e560 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1e570 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
1e580 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
1e590 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1e5a0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e5b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e5c0 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
1e5d0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1e5e0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
1e5f0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
1e600 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1e610 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
1e620 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
1e630 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
1e640 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
1e650 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
1e660 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
1e670 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
1e680 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
1e690 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
1e6a0 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
1e6b0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
1e6c0 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
1e6d0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
1e6e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
1e6f0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
1e700 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1e710 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
1e720 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1e730 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
1e740 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
1e750 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1e760 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
1e770 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
1e780 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
1e790 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
1e7a0 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
1e7b0 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
1e7c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e7d0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1e7e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1e7f0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1e800 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e810 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e820 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1e830 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
1e840 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
1e850 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e860 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
1e870 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
1e880 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1e890 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
1e8a0 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1e8b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1e8c0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1e8d0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1e8e0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
1e8f0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
1e900 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
1e910 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
1e920 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1e930 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1e940 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1e950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e960 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1e970 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1e980 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1e990 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1e9a0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1e9b0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1e9c0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1e9d0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1e9e0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1e9f0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1ea00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
1ea10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1ea20 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1ea30 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
1ea40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1ea50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ea60 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1ea70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1ea80 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1ea90 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
1eaa0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
1eab0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
1eac0 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
1ead0 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
1eae0 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
1eaf0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1eb00 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
1eb10 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
1eb20 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
1eb30 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
1eb40 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1eb50 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1eb60 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
1eb70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1eb80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1eb90 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
1eba0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1ebb0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1ebc0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1ebd0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1ebe0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ebf0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
1ec00 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
1ec10 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
1ec20 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1ec30 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
1ec40 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1ec50 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1ec60 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  s(nKey1, pKey1, 
1ec70 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ec80 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
1ec90 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
1eca0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
1ecb0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1ecc0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1ecd0 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
1ece0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1ecf0 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
1ed00 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
1ed10 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1ed20 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
1ed30 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1ed40 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
1ed50 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
1ed60 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
1ed70 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
1ed80 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
1ed90 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
1eda0 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
1edb0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1edc0 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
1edd0 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
1ede0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
1edf0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1ee00 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ee10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1ee20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1ee30 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1ee40 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
1ee50 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
1ee60 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
1ee70 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1ee80 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
1ee90 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
1eea0 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
1eeb0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1eec0 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
1eed0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1eee0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
1eef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1ef00 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1ef10 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1ef20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1ef30 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1ef40 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1ef50 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
1ef60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ef70 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1ef80 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1ef90 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1efa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
1efb0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
1efc0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1efd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1efe0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1eff0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
1f000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
1f010 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
1f020 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
1f030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f040 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1f050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1f060 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1f070 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1f080 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1f090 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
1f0a0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
1f0b0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
1f0c0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1f0d0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
1f0e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1f0f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1f100 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1f110 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f120 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
1f130 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
1f140 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
1f150 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
1f160 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
1f170 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
1f180 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
1f190 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
1f1a0 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
1f1b0 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
1f1c0 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
1f1d0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
1f1e0 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
1f1f0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1f200 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1f210 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
1f220 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
1f230 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
1f240 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
1f250 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
1f260 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
1f270 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
1f280 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
1f290 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
1f2a0 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
1f2b0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
1f2c0 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
1f2d0 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
1f2e0 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
1f2f0 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
1f300 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
1f310 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
1f320 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
1f330 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
1f340 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
1f350 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
1f360 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
1f370 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
1f380 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
1f390 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
1f3a0 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
1f3b0 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
1f3c0 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
1f3d0 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
1f3e0 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
1f3f0 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
1f400 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
1f410 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
1f420 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
1f430 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
1f440 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
1f450 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
1f460 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
1f470 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
1f480 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
1f490 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
1f4a0 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
1f4b0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
1f4c0 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
1f4d0 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
1f4e0 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
1f4f0 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
1f500 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
1f510 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
1f520 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1f530 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
1f540 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
1f550 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
1f560 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
1f570 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
1f580 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1f590 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
1f5a0 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
1f5b0 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
1f5c0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
1f5d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
1f5e0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
1f5f0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
1f600 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
1f610 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1f620 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
1f630 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1f640 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
1f650 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
1f660 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
1f670 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
1f680 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1f690 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
1f6a0 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
1f6b0 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
1f6c0 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
1f6d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
1f6e0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1f6f0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
1f700 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
1f710 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
1f720 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
1f730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1f740 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1f750 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
1f760 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
1f770 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
1f780 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
1f790 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
1f7a0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
1f7b0 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
1f7c0 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
1f7d0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
1f7e0 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
1f7f0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
1f800 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1f810 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
1f820 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1f830 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1f840 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
1f850 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
1f860 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
1f870 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
1f880 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
1f890 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
1f8a0 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
1f8b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
1f8c0 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
1f8d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1f8e0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
1f8f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
1f900 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1f910 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
1f920 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
1f930 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
1f940 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
1f950 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
1f960 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
1f970 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
1f980 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
1f990 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
1f9a0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
1f9b0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
1f9c0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
1f9d0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
1f9e0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
1f9f0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
1fa00 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
1fa10 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
1fa20 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
1fa30 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
1fa40 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
1fa50 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
1fa60 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
1fa70 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
1fa80 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1fa90 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
1faa0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
1fab0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
1fac0 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
1fad0 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
1fae0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
1faf0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1fb00 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
1fb10 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
1fb20 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
1fb30 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
1fb40 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
1fb50 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1fb60 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
1fb70 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
1fb80 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
1fb90 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
1fba0 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
1fbb0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
1fbc0 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
1fbd0 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
1fbe0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
1fbf0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
1fc00 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
1fc10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1fc20 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
1fc30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1fc40 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
1fc50 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
1fc60 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
1fc70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1fc80 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1fc90 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
1fca0 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
1fcb0 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
1fcc0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1fcd0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
1fce0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
1fcf0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
1fd00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
1fd10 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
1fd20 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
1fd30 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
1fd40 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
1fd50 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1fd60 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1fd70 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
1fd80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
1fd90 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
1fda0 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
1fdb0 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
1fdc0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1fdd0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
1fde0 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
1fdf0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
1fe00 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
1fe10 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
1fe20 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1fe30 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
1fe40 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1fe50 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
1fe60 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
1fe70 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1fe80 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
1fe90 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1fea0 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
1feb0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1fec0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
1fed0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
1fee0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1fef0 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
1ff00 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
1ff10 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
1ff20 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
1ff30 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
1ff40 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1ff50 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
1ff60 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
1ff70 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1ff80 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74  [typeRowid];.  t
1ff90 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
1ffa0 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
1ffb0 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
1ffc0 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
1ffd0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
1ffe0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
1fff0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
20000 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
20010 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
20020 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
20030 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
20040 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
20050 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
20060 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
20070 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
20080 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
20090 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
200a0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
200b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
200c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
200d0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
200e0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
200f0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
20100 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
20110 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
20120 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
20130 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20140 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
20150 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
20160 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c  stcase( m.szMall
20170 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
20180 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
20190 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
201a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
201b0 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
201c0 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
201d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
201e0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
201f0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
20200 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
20210 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
20220 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
20230 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
20240 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
20250 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
20260 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
20270 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
20280 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
20290 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
202a0 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
202b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
202c0 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
202d0 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
202e0 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
202f0 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
20300 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
20310 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
20320 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
20330 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
20340 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
20350 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
20360 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
20370 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
20380 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
20390 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
203a0 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
203b0 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
203c0 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
203d0 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
203e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
203f0 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73  xKeyCompare(.  s
20400 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
20430 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
20440 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20460 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
20470 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
20480 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20490 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
204a0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
204b0 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
204c0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
204f0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
20500 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
20510 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
20520 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
20530 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
20540 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
20550 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
20560 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
20570 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
20580 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
20590 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
205a0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
205b0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
205c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
205d0 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
205e0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
205f0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
20600 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
20610 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
20620 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
20630 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
20640 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
20650 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
20660 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
20670 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
20680 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
20690 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
206a0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
206b0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
206c0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
206d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
206e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
206f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  T_BKPT;.  }.  sq
20700 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
20710 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
20720 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
20730 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
20740 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32  pCursor, 0, (u32
20750 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
20760 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
20770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20780 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
20790 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
207a0 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
207b0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
207c0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
207d0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
207e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
207f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20800 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
20810 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
20820 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
20830 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
20840 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
20850 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
20860 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
20870 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
20880 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
20890 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
208a0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
208b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
208c0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
208d0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
208e0 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
208f0 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
20900 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
20910 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
20920 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
20930 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
20940 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
20950 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
20960 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
20970 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
20980 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
20990 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
209a0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
209b0 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
209c0 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
209d0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
209e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
209f0 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
20a00 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
20a10 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
20a20 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
20a30 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
20a40 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
20a50 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
20a60 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
20a70 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
20a80 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
20a90 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
20aa0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
20ab0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
20ac0 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
20ad0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
20ae0 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
20af0 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
20b00 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
20b10 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
20b20 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
20b30 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
20b40 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
20b50 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
20b60 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
20b70 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
20b80 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
20b90 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
20ba0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
20bb0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
20bc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
20bd0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
20be0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
20bf0 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
20c00 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
20c10 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
20c20 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
20c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20c40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
20c50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
20c60 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
20c70 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75  ng the value bou
20c80 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
20c90 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78  iVar of VM v. Ex
20ca0 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c  cept, if the val
20cb0 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c  ue is an SQL NUL
20cc0 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20  L, return .** 0 
20cd0 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20  instead. Unless 
20ce0 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c  it is NULL, appl
20cf0 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28  y affinity aff (
20d00 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
20d10 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74  E_AFF_*.** const
20d20 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c  ants) to the val
20d30 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
20d40 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ing it..**.** Th
20d50 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
20d60 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
20d70 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
20d80 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ng sqlite3ValueF
20d90 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ree()..*/.sqlite
20da0 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
20db0 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
20dc0 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
20dd0 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
20de0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
20df0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
20e00 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
20e10 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
20e20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
20e30 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
20e40 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
20e50 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
20e60 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
20e70 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
20e80 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
20e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
20ea0 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
20eb0 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
20ec0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
20ed0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
20ee0 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
20ef0 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
20f00 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
20f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20f20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20f30 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
20f40 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
20f50 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
20f60 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
20f70 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
20f80 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
20f90 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
20fa0 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
20fb0 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
20fc0 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
20fd0 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
20fe0 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
20ff0 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
21000 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
21010 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
21020 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
21030 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
21040 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
21050 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
21060 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
21070 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
21080 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21090 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
210a0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
210b0 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
210c0 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
210d0 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
210e0 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
210f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
21100 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
21110 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
21120 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
21130 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
21140 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
21150 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
21160 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
21170 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
21180 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
21190 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
211a0 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65  pVtab){.  sqlite
211b0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
211c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
211d0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
211e0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
211f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
21200 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  b, pVtab->zErrMs
21210 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
21220 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
21230 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  g);.  pVtab->zEr
21240 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  rMsg = 0;.}.#end
21250 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21260 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
21270 2f 0a                                            /.