/ Hex Artifact Content
Login

Artifact 0e5a83f4dba6ef2978c2852aa8e1e20713b7d1b7:


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 23 69 66 64 65 66 20  .      }.#ifdef 
56f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
5700: 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20  RSOR_HINTS.     
5710: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
5720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5730: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28  ExprDelete(db, (
5740: 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20  Expr*)p4);.     
5750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5760: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
5770: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
5780: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5790: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
57a0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
57b0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
57c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
57d0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
57e0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
57f0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
5800: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
5810: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5830: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
5840: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5850: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5870: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
5880: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
5890: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
58a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
58b0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
58c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
58d0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
58e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
58f0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
5900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
5910: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
5920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
5930: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5940: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
5950: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
5960: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5970: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
5980: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
5990: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20   *)p4);.        
59a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
59b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
59c0: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
59d0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
59e0: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
59f0: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
5a00: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
5a10: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
5a20: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
5a30: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
5a40: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
5a50: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
5a60: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
5a70: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
5a80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
5a90: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
5aa0: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
5ab0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
5ac0: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
5ad0: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
5ae0: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
5af0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5b00: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
5b10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5b20: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5b30: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
5b40: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
5b50: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
5b60: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
5b70: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5b80: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
5b90: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
5ba0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
5bb0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5bc0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
5bd0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
5be0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
5bf0: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
5c00: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
5c10: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
5c20: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
5c30: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
5c40: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
5c50: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
5c60: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
5c70: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
5c80: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
5c90: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
5ca0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
5cb0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
5cc0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
5cd0: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
5ce0: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
5cf0: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20  OP_Noop.*/.void 
5d00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5d10: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
5d20: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66   int addr){.  if
5d30: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b  ( addr<p->nOp ){
5d40: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
5d50: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5d60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5d70: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66  b = p->db;.    f
5d80: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
5d90: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
5da0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  );.    memset(pO
5db0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
5dc0: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  [0]));.    pOp->
5dd0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
5de0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d  ;.    if( addr==
5df0: 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f  p->nOp-1 ) p->nO
5e00: 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
5e10: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70  * If the last op
5e20: 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64  code is "op" and
5e30: 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d   it is not a jum
5e40: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a  p destination,.*
5e50: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74  * then remove it
5e60: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
5e70: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e  f and only if an
5e80: 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f   opcode was remo
5e90: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
5ea0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69  te3VdbeDeletePri
5eb0: 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  orOpcode(Vdbe *p
5ec0: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20  , u8 op){.  if( 
5ed0: 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70  (p->nOp-1)>(p->p
5ee0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29  Parse->iFixedOp)
5ef0: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
5f00: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
5f10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5f20: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
5f30: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20  , p->nOp-1);.   
5f40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
5f50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
5f60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
5f70: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
5f80: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
5f90: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
5fa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
5fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5fc0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
5fd0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
5fe0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
5ff0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
6000: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
6010: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
6020: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
6030: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
6040: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
6050: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
6060: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
6070: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
6080: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
6090: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
60a0: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
60b0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
60c0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
60d0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
60e0: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
60f0: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
6100: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
6110: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
6120: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
6130: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
6140: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
6150: 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68   zP4..** .** Oth
6160: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
6170: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
6180: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
6190: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
61a0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
61b0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
61c0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
61d0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
61e0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
61f0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
6200: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
6210: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
6220: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
6230: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
6240: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
6250: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
6260: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
6270: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
6280: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
6290: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
62a0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
62b0: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
62c0: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
62d0: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
62e0: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
62f0: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
6300: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6310: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
6320: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
6330: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6340: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d  d ){.    if( n!=
6350: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20  P4_VTAB ){.     
6360: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
6370: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
6380: 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zP4);.    }.    
6390: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
63a0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
63b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
63c0: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
63d0: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
63e0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
63f0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
6400: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61  ->aOp[addr];.  a
6410: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
6420: 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20  pe==P4_NOTUSED. 
6430: 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34        || pOp->p4
6440: 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20  type==P4_INT32. 
6450: 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34        || pOp->p4
6460: 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
6470: 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c   );.  freeP4(db,
6480: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6490: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
64a0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
64b0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
64c0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
64d0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
64e0: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
64f0: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
6500: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
6510: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
6520: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
6530: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
6540: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
6550: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
6560: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
6570: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
6580: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
6590: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
65a0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
65b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
65c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
65d0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
65e0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
65f0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6600: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
6610: 45 59 49 4e 46 4f 3b 0a 23 69 66 64 65 66 20 53  EYINFO;.#ifdef S
6620: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
6630: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 7d 65 6c 73  SOR_HINTS.  }els
6640: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 45 58 50 52  e if( n==P4_EXPR
6650: 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 73 70 6f   ){.    /* Respo
6660: 6e 73 69 62 69 6c 69 74 79 20 66 6f 72 20 64 65  nsibility for de
6670: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
6680: 74 72 65 65 20 69 73 20 68 61 6e 64 65 64 20 6f  tree is handed o
6690: 76 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ver to the.    *
66a0: 2a 20 56 44 42 45 20 62 79 20 74 68 69 73 20 6f  * VDBE by this o
66b0: 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  peration.  The c
66c0: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
66d0: 65 20 61 6c 72 65 61 64 79 20 69 6e 76 6f 6b 65  e already invoke
66e0: 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
66f0: 45 78 70 72 44 75 70 28 29 20 6f 72 20 77 68 61  ExprDup() or wha
6700: 74 65 76 65 72 20 6f 74 68 65 72 20 72 6f 75 74  tever other rout
6710: 69 6e 65 20 69 73 20 6e 65 65 64 65 64 20 74 6f  ine is needed to
6720: 20 6d 61 6b 65 20 61 20 0a 20 20 20 20 2a 2a 20   make a .    ** 
6730: 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66 20  private copy of 
6740: 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20  the tree. */.   
6750: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 20 3d   pOp->p4.pExpr =
6760: 20 28 45 78 70 72 2a 29 7a 50 34 3b 0a 20 20 20   (Expr*)zP4;.   
6770: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
6780: 34 5f 45 58 50 52 3b 0a 23 65 6e 64 69 66 0a 20  4_EXPR;.#endif. 
6790: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
67a0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
67b0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
67c0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
67d0: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
67e0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
67f0: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
6800: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
6810: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
6820: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
6830: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
6840: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6850: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
6860: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
6870: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
6880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6890: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
68a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
68b0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
68c0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
68d0: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
68e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
68f0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
6900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
6910: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
6920: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
6930: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
6940: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
6950: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
6960: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6970: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6980: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6990: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
69a0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
69b0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
69c0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
69d0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
69e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
69f0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
6a00: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
6a10: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
6a20: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
6a40: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
6a50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6a60: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6a70: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
6a80: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
6a90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6aa0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6ab0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
6ac0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
6ad0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
6ae0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
6af0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
6b00: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
6b10: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
6b20: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
6b30: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
6b40: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
6b50: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
6b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b70: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
6b80: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
6b90: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
6ba0: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
6bb0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
6bc0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
6bd0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
6be0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
6bf0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
6c00: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
6c10: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6c20: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
6c30: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
6c40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6c50: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
6c60: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6c70: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
6c80: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6c90: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
6ca0: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
6cb0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
6cc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6cd0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6ce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
6cf0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6d00: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6d10: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
6d20: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
6d30: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
6d40: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6d50: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6d60: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
6d70: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
6d80: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6d90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6da0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6db0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6dd0: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
6de0: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
6df0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
6e00: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
6e10: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
6e20: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
6e30: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
6e40: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
6e50: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
6e60: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
6e70: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
6e80: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
6e90: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
6ea0: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
6eb0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
6ed0: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
6ee0: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6f00: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
6f10: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
6f20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
6f30: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
6f40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6f50: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
6f60: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
6f70: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
6f80: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
6f90: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
6fa0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
6fb0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
6fc0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6fd0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6fe0: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
6ff0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
7000: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
7010: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
7020: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
7030: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
7040: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
7050: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
7060: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
7070: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
7080: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
7090: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
70a0: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
70b0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
70c0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
70d0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
70e0: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
70f0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
7100: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
7110: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
7120: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
7130: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
7140: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
7150: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
7160: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
7170: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
7180: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
7190: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
71a0: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
71b0: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
71c0: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
71d0: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
71e0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
71f0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
7200: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
7210: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
7220: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
7230: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
7240: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
7250: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
7260: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
7270: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
7280: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
7290: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
72a0: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
72b0: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
72c0: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
72d0: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
72e0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
72f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
7300: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
7310: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
7320: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
7330: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
7340: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
7350: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
7360: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7370: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
7380: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7390: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
73a0: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
73b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
73c0: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
73d0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
73e0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
73f0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7400: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
7410: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
7420: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
7430: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
7440: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
7450: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
7460: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
7470: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
7480: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
7490: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
74a0: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
74b0: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
74c0: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
74d0: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
74e0: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
74f0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
7500: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
7510: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
7520: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
7530: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
7540: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
7550: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
7560: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
7570: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
7580: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
7590: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
75a0: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
75b0: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
75c0: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
75d0: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
75e0: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
75f0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
7600: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
7610: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
7620: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
7630: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
7640: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
7650: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
7660: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
7670: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
7680: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
7690: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
76a0: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
76b0: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
76c0: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
76d0: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
76e0: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
76f0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
7700: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7710: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
7720: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
7730: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
7740: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
7750: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
7760: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
7770: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
7780: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
7790: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
77a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
77b0: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
77c0: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
77d0: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
77e0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
77f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
7800: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
7810: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
7820: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
7830: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
7840: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
7850: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
7860: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
7870: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
7880: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
7890: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
78a0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
78b0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
78c0: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
78d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
78e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
78f0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
7900: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
7910: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
7920: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
7930: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
7940: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
7950: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
7960: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
7970: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
7980: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
7990: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
79a0: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
79b0: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
79c0: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
79d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
79e0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
79f0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7a00: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
7a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
7a20: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
7a30: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7a40: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7a50: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
7a60: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7a70: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
7a80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7a90: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
7aa0: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
7ab0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7ac0: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7ae0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7af0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
7b00: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
7b10: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7b20: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
7b30: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
7b40: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
7b50: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
7b60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7b70: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7b80: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
7b90: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
7ba0: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
7bb0: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
7bc0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7bd0: 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b  +1,"+1",2)==0 ){
7be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7bf0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7c00: 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20        v2++;.    
7c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c20: 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29        if( v2>1 )
7c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7c40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7c50: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7c60: 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b  +jj, "..%d", v1+
7c70: 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  v2-1);.         
7c80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7c90: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
7ca0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7cb0: 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26   "..P3", 4)==0 &
7cc0: 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a  & pOp->p3==0 ){.
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7ce0: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
7cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7d00: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
7d10: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
7d20: 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j);.      }else{
7d30: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a  .        zTemp[j
7d40: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
7d50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7d60: 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e  !seenCom && jj<n
7d70: 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a  Temp-5 && pOp->z
7d80: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
7d90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7da0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
7db0: 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f  p+jj, "; %s", pO
7dc0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
7dd0: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7de0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
7df0: 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  jj);.    }.    i
7e00: 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54  f( jj<nTemp ) zT
7e10: 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d  emp[jj] = 0;.  }
7e20: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43  else if( pOp->zC
7e30: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  omment ){.    sq
7e40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7e50: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
7e60: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7e70: 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69  );.    jj = sqli
7e80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7e90: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
7ea0: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
7eb0: 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20     jj = 0;.  }. 
7ec0: 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65   return jj;.}.#e
7ed0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
7ee0: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42  EBUG */..#if VDB
7ef0: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
7f00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
7f10: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
7f20: 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  TS)./*.** Transl
7f30: 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72  ate the P4.pExpr
7f40: 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50   value for an OP
7f50: 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f  _CursorHint opco
7f60: 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20  de into text.** 
7f70: 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70  that can be disp
7f80: 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20  layed in the P4 
7f90: 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49  column of EXPLAI
7fa0: 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61  N output..*/.sta
7fb0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 50  tic int displayP
7fc0: 34 45 78 70 72 28 69 6e 74 20 6e 54 65 6d 70 2c  4Expr(int nTemp,
7fd0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 45 78   char *zTemp, Ex
7fe0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f  pr *pExpr){.  co
7ff0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
8000: 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 77  0;.  int n;.  sw
8010: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8020: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
8030: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
8040: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8050: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 51 22  emp, zTemp, "%Q"
8060: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
8070: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
8080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
8090: 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69  EGER:.      sqli
80a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
80b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
80c0: 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
80d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
80e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
80f0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
8100: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8110: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
8120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8130: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
8140: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
8150: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8160: 70 2c 20 7a 54 65 6d 70 2c 20 22 72 5b 25 64 5d  p, zTemp, "r[%d]
8170: 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
8180: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8190: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
81a0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
81b0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
81c0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
81d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
81e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
81f0: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
8200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8210: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8220: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8230: 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72  c%d", (int)pExpr
8240: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
8250: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8260: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8270: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LT:      zOp 
8280: 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65  = "LT";      bre
8290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
82a0: 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  LE:      zOp = "
82b0: 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  LE";      break;
82c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
82d0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22        zOp = "GT"
82e0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
82f0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
8300: 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20     zOp = "GE";  
8310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8320: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
8330: 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20  zOp = "NE";     
8340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8350: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70   TK_EQ:      zOp
8360: 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62 72   = "EQ";      br
8370: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8380: 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _IS:      zOp = 
8390: 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "IS";      break
83a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
83b0: 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53  NOT:   zOp = "IS
83c0: 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  NOT";   break;. 
83d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
83e0: 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b      zOp = "AND";
83f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8400: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20  case TK_OR:     
8410: 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20   zOp = "OR";    
8420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8430: 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f  e TK_PLUS:    zO
8440: 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62  p = "ADD";     b
8450: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8460: 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d  K_STAR:    zOp =
8470: 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61   "MUL";     brea
8480: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
8490: 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53  INUS:   zOp = "S
84a0: 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  UB";     break;.
84b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
84c0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22       zOp = "REM"
84d0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
84e0: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
84f0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22    zOp = "BITAND"
8500: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8510: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
8520: 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20  Op = "BITOR";   
8530: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8540: 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20  TK_SLASH:   zOp 
8550: 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72 65  = "DIV";     bre
8560: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8570: 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  LSHIFT:  zOp = "
8580: 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  LSHIFT";  break;
8590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
85a0: 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48  IFT:  zOp = "RSH
85b0: 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IFT";  break;.  
85c0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
85d0: 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54  :  zOp = "CONCAT
85e0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
85f0: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
8600: 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20  zOp = "MINUS";  
8610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8620: 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70   TK_UPLUS:   zOp
8630: 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72   = "PLUS";    br
8640: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8650: 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20  _BITNOT:  zOp = 
8660: 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b  "BITNOT";  break
8670: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
8680: 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f  T:     zOp = "NO
8690: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
86a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
86b0: 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c  L:  zOp = "ISNUL
86c0: 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  L";  break;.    
86d0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
86e0: 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22   zOp = "NOTNULL"
86f0: 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65  ; break;..    de
8700: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c  fault:.      sql
8710: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8720: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
8730: 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20  , "expr");.     
8740: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
8750: 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71  f( zOp ){.    sq
8760: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8770: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
8780: 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 6e 20  (", zOp);.    n 
8790: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
87a0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 6e 20  0(zTemp);.    n 
87b0: 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  += displayP4Expr
87c0: 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b  (nTemp-n, zTemp+
87d0: 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  n, pExpr->pLeft)
87e0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 6e 54 65 6d  ;.    if( n<nTem
87f0: 70 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 70 52  p-1 && pExpr->pR
8800: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 7a 54  ight ){.      zT
8810: 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[n++] = ',';.
8820: 20 20 20 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c        n += displ
8830: 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e  ayP4Expr(nTemp-n
8840: 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72  , zTemp+n, pExpr
8850: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8860: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8870: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c 20 7a  rintf(nTemp-n, z
8880: 54 65 6d 70 2b 6e 2c 20 22 29 22 29 3b 0a 20 20  Temp+n, ")");.  
8890: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
88a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
88b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  );.}.#endif /* V
88c0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
88d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
88e0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
88f0: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
8900: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
8910: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
8920: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
8930: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
8940: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
8950: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
8960: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
8970: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
8980: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
8990: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
89a0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
89b0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
89c0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
89d0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
89e0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
89f0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
8a00: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8a10: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
8a20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
8a30: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
8a40: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
8a50: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
8a60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
8a70: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8a80: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
8a90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8aa0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
8ab0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
8ac0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
8ad0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8ae0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
8af0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
8b00: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
8b10: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
8b20: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
8b30: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
8b40: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8b50: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
8b60: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
8b70: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
8b80: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
8b90: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
8ba0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
8bb0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
8bc0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
8bd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
8be0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
8bf0: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
8c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8c10: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37 20 29  f( i+n>nTemp-7 )
8c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
8c30: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
8c40: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
8c50: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
8c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
8c80: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
8c90: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
8ca0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
8cb0: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
8cc0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
8cd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ce0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
8cf0: 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31  p[i], zColl, n+1
8d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
8d10: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8d20: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29   zTemp[i++] = ')
8d30: 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  ';.      zTemp[i
8d40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  ] = 0;.      ass
8d50: 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a  ert( i<nTemp );.
8d60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d70: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8d80: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8d90: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
8da0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
8db0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65  isplayP4Expr(nTe
8dc0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 70 4f 70 2d 3e  mp, zTemp, pOp->
8dd0: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
8de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8df0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
8e00: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
8e10: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8e20: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
8e30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8e40: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8e50: 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22  zTemp, "(%.20s)"
8e60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
8e70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8e80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
8e90: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
8ea0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
8eb0: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
8ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8ed0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8ee0: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
8ef0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
8f00: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
8f10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
8f20: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8f30: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
8f40: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
8f50: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
8f60: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
8f70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8f80: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8f90: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
8fa0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
8fb0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
8fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8fd0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
8fe0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
8ff0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9000: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9010: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
9020: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
9030: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9040: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
9050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9060: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
9070: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
9080: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
9090: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
90a0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
90b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
90c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
90d0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
90e0: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
90f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9100: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
9110: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
9120: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
9130: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
9140: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
9150: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
9160: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
9170: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
9180: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
9190: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
91a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
91b0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
91c0: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
91d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
91e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
91f0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
9200: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9210: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9220: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
9230: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
9240: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9250: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
9260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9270: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9280: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
9290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
92a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
92b0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
92c0: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
92d0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
92f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
9300: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9310: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
9320: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
9330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
9340: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
9350: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
9360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9370: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9380: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c  Temp, "vtab:%p",
9390: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
93a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
93b0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
93c0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
93d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
93e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
93f0: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
9400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9410: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
9420: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
9430: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9440: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9450: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
9460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9470: 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43    case P4_ADVANC
9480: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  E: {.      zTemp
9490: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [0] = 0;.      b
94a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
94b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
94c0: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
94d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
94e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
94f0: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
9500: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
9510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9520: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34   }.  assert( zP4
9530: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
9540: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  zP4;.}.#endif /*
9550: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
9560: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61   */../*.** Decla
9570: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
9580: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
9590: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
95a0: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
95b0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
95c0: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
95d0: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
95e0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
95f0: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
9600: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
9610: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
9620: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
9630: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
9640: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
9650: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
9660: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
9670: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
9680: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
9690: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
96a0: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
96b0: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
96c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
96d0: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
96e0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
96f0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
9700: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
9710: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
9720: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
9730: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
9740: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
9750: 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e  .  DbMaskSet(p->
9760: 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20  btreeMask, i);. 
9770: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
9780: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
9790: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
97a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61  pBt) ){.    DbMa
97b0: 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  skSet(p->lockMas
97c0: 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  k, i);.  }.}..#i
97d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
97e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
97f0: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
9800: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
9810: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
9820: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
9830: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
9840: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
9850: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
9860: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
9870: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
9880: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
9890: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
98a0: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
98b0: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
98c0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
98d0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
98e0: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
98f0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
9900: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
9910: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
9920: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9930: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
9940: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
9950: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
9960: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
9970: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
9980: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
9990: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
99a0: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
99b0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
99c0: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
99d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
99e0: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
99f0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
9a00: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
9a10: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
9a20: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
9a30: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
9a40: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
9a50: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
9a60: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
9a70: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
9a80: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
9a90: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
9aa0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
9ab0: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
9ac0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
9ad0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
9ae0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
9af0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
9b00: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
9b10: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
9b20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
9b30: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
9b40: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
9b50: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
9b60: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
9b70: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
9b80: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
9b90: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
9ba0: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
9bb0: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
9bc0: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
9bd0: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
9be0: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
9bf0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
9c00: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
9c10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
9c20: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
9c30: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
9c40: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
9c50: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
9c60: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
9c70: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
9c80: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
9c90: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
9ca0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
9cb0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
9cc0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
9cd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
9ce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
9cf0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
9d00: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
9d10: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
9d20: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
9d30: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
9d40: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
9d50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
9d60: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
9d70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
9d80: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
9d90: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9da0: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
9db0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
9dc0: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
9dd0: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
9de0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
9df0: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er()..*/.static 
9e00: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
9e10: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56  void vdbeLeave(V
9e20: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
9e30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
9e40: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
9e50: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d  t nDb;.  db = p-
9e60: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
9e70: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
9e80: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
9e90: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
9ea0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
9eb0: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
9ec0: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
9ed0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
9ee0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
9ef0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
9f00: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
9f10: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
9f20: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
9f30: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61   *p){.  if( DbMa
9f40: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
9f50: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
9f60: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
9f70: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65  case */.  vdbeLe
9f80: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ave(p);.}.#endif
9f90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
9fa0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
9fb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
9fc0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
9fd0: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
9fe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9ff0: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
a000: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
a010: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
a020: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
a030: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
a040: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
a050: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
a060: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
a070: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
a080: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
a090: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
a0a0: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
a0b0: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
a0c0: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
a0d0: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
a0e0: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
a0f0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
a100: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
a110: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
a120: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
a130: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
a140: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
a150: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
a160: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
a170: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
a180: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
a190: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
a1a0: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
a1b0: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
a1c0: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
a1d0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
a1e0: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
a1f0: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
a200: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
a210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
a220: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
a230: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
a240: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
a250: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
a260: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
a270: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
a280: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
a290: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
a2a0: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
a2b0: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
a2c0: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
a2d0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
a2e0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
a2f0: 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73  em elements.*/.s
a300: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a310: 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  seMemArray(Mem *
a320: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  p, int N){.  if(
a330: 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d   p && N ){.    M
a340: 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d  em *pEnd = &p[N]
a350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
a360: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
a370: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
a380: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
a390: 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ed;.    if( db->
a3a0: 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a  pnBytesFreed ){.
a3b0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
a3c0: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
a3d0: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
a3e0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
a3f0: 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
a400: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
a410: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
a420: 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
a430: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
a440: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
a450: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20  b==p[1].db );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a470: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
a480: 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a  nvariants(p) );.
a490: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
a4a0: 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61  lock is really a
a4b0: 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f  n inlined versio
a4c0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
a4d0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20  MemRelease().   
a4e0: 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73     ** that takes
a4f0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
a500: 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
a510: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75  memory cell valu
a520: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62  e is .      ** b
a530: 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c  eing set to NULL
a540: 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67   after releasing
a550: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73   any dynamic res
a560: 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ources..      **
a570: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
a580: 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20  stification for 
a590: 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65  duplicating code
a5a0: 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69   is that accordi
a5b0: 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ng to .      ** 
a5c0: 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20  callgrind, this 
a5d0: 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e  causes a certain
a5e0: 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69   test case to hi
a5f0: 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20  t the CPU 4.7 . 
a600: 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20       ** percent 
a610: 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c  less (x86 linux,
a620: 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31   gcc version 4.1
a630: 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66  .2, -O6) than if
a640: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74   .      ** sqlit
a650: 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77  e3MemRelease() w
a660: 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ere called from 
a670: 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20  here. With -O2, 
a680: 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20  this jumps.     
a690: 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65   ** to 6.6 perce
a6a0: 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73  nt. The test cas
a6b0: 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31  e is inserting 1
a6c0: 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20  000 rows into a 
a6d0: 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20  table .      ** 
a6e0: 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20  with no indexes 
a6f0: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70  using a single p
a700: 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73  repared INSERT s
a710: 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29  tatement, bind()
a720: 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72   .      ** and r
a730: 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20  eset(). Inserts 
a740: 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f  are grouped into
a750: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
a760: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
a770: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
a780: 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20  s & MEM_Agg );. 
a790: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a7a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
a7b0: 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  n );.      testc
a7c0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
a7d0: 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20  MEM_Frame );.   
a7e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a7f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
a800: 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  et );.      if( 
a810: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
a820: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
a830: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
a840: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a850: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
a860: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
a870: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
a880: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a890: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
a8a0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
a8b0: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
a8c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
a8d0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
a8e0: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
a8f0: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
a900: 45 6e 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  End );.    db->m
a910: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
a920: 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  lloc_failed;.  }
a930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
a940: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
a950: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
a960: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
a970: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
a980: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
a990: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
a9a0: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
a9b0: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
a9c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
a9d0: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
a9e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a9f0: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
aa00: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
aa10: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
aa20: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
aa30: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
aa40: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
aa50: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
aa60: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
aa70: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
aa80: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
aa90: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
aaa0: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
aab0: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
aac0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
aad0: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a  p->v->db, p);.}.
aae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
ab00: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
ab10: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
ab20: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
ab30: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
ab40: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
ab50: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
ab60: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
ab70: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
ab80: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
ab90: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
aba0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
abb0: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
abc0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
abd0: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
abe0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
abf0: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
ac00: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
ac10: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
ac20: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
ac30: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
ac40: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
ac50: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
ac60: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
ac70: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
ac80: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
ac90: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
aca0: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
acb0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
acc0: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
acd0: 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  PLAN..**.** When
ace0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
acf0: 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70  first the main p
ad00: 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64  rogram is listed
ad10: 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a  , then each of.*
ad20: 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75  * the trigger su
ad30: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69  bprograms are li
ad40: 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  sted one by one.
ad50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
ad60: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
ad70: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
ad80: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
ad90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f   */.){.  int nRo
ada0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
adc0: 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63   Stop when row c
add0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69  ount reaches thi
ade0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20  s */.  int nSub 
adf0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ae10: 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62  umber of sub-vdb
ae20: 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  es seen so far *
ae30: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
ae40: 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20  *apSub = 0;     
ae50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
ae60: 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a  y of sub-vdbes *
ae70: 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20  /.  Mem *pSub = 
ae80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ae90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
aea0: 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72  ry cell hold arr
aeb0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a  ay of subprogs *
aec0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
aed0: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  = p->db;        
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
aef0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
af00: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ion */.  int i; 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
af40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
af50: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
af60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
af70: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20  n code */.  Mem 
af80: 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
af90: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
afa0: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
afb0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
afc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
afd0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
afe0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
aff0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
b000: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
b010: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
b020: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
b030: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
b040: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
b050: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
b060: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
b070: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
b080: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
b090: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
b0a0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
b0b0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
b0c0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
b0d0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
b0e0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
b0f0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
b100: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
b110: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
b120: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
b130: 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75  , 8);.  p->pResu
b140: 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ltSet = 0;..  if
b150: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b160: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
b170: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
b180: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
b190: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
b1a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b1b0: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
b1c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
b1d0: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
b1e0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
b1f0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
b200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
b210: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  R;.  }..  /* Whe
b220: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b230: 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63  output rows reac
b240: 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d  hes nRow, that m
b250: 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69  eans the.  ** li
b260: 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  sting has finish
b270: 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  ed and sqlite3_s
b280: 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74  tep() should ret
b290: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
b2a0: 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68  .  ** nRow is th
b2b0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
b2c0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
b2d0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c  he main program,
b2e0: 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73   plus.  ** the s
b2f0: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
b300: 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20   of rows in all 
b310: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b320: 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a  ams encountered.
b330: 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68    ** so far.  Th
b340: 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c  e nRow value wil
b350: 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65  l increase as ne
b360: 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  w trigger subpro
b370: 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65  grams are.  ** e
b380: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20  ncountered, but 
b390: 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74  p->pc will event
b3a0: 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74  ually catch up t
b3b0: 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e  o nRow..  */.  n
b3c0: 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  Row = p->nOp;.  
b3d0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
b3e0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
b3f0: 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63  first 8 memory c
b400: 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f  ells are used fo
b410: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
b420: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20  .  So we will.  
b430: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20    ** commandeer 
b440: 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20  the 9th cell to 
b450: 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66  use as storage f
b460: 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  or an array of p
b470: 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74  ointers.    ** t
b480: 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  o trigger subpro
b490: 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45  grams.  The VDBE
b4a0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
b4b0: 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  o have at least 
b4c0: 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20  9.    ** cells. 
b4d0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
b4e0: 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20  p->nMem>9 );.   
b4f0: 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d   pSub = &p->aMem
b500: 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75  [9];.    if( pSu
b510: 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  b->flags&MEM_Blo
b520: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  b ){.      /* On
b530: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
b540: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
b550: 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c  ), pSub will hol
b560: 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  d a NULL.  It is
b570: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
b580: 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20  lized to a BLOB 
b590: 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f  by the P4_SUBPRO
b5a0: 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20  GRAM processing 
b5b0: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20  logic below */. 
b5c0: 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62       nSub = pSub
b5d0: 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a  ->n/sizeof(Vdbe*
b5e0: 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d  );.      apSub =
b5f0: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
b600: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20  pSub->z;.    }. 
b610: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
b620: 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; i++){.      
b630: 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d  nRow += apSub[i]
b640: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
b650: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
b660: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
b670: 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e  e( i<nRow && p->
b680: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
b690: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
b6a0: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
b6b0: 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20  if( i>=nRow ){. 
b6c0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
b6d0: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
b6e0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
b6f0: 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69  lse if( db->u1.i
b700: 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a  sInterrupted ){.
b710: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
b720: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
b730: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
b740: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
b750: 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c  VdbeError(p, sql
b760: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
b770: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
b780: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20   char *zP4;.    
b790: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
b7a0: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
b7b0: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
b7c0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
b7d0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
b7e0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
b7f0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
b800: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
b810: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
b820: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
b830: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
b840: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
b850: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
b860: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
b870: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
b880: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
b890: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
b8a0: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
b8b0: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
b8c0: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
b8d0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
b8e0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
b8f0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
b900: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
b910: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
b920: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
b930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b940: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
b950: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
b960: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
b970: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
b980: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
b9b0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
b9c0: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
b9d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b9e0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
b9f0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
ba00: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
ba10: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
ba20: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
ba30: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
ba40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ba50: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
ba60: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
ba70: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
ba80: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
ba90: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
baa0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
bab0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
bac0: 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  an OP_Program op
bad0: 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  code is encounte
bae0: 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f  r (the only opco
baf0: 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  de that has.    
bb00: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
bb10: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
bb20: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
bb30: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
bb40: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
bb50: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
bb60: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
bb70: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
bb80: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
bb90: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
bba0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c     ** has not al
bbb0: 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e  ready been seen.
bbc0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bbd0: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
bbe0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
bc00: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
bc10: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
bc20: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
bc30: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
bc40: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
bc50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
bc60: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
bc70: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
bc80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
bc90: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
bca0: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
bcb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
bcc0: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
bcd0: 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  nSub!=0) ){.    
bce0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
bcf0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
bd00: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  b->z;.          
bd10: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
bd20: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
bd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
bd40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42  ->flags |= MEM_B
bd50: 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  lob;.          p
bd60: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
bd70: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
bd80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bd90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
bda0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bdb0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
bdc0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
bdf0: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
be00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
be10: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
be20: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
be30: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
be40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
be50: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  2 */.    pMem++;
be60: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
be70: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
be80: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
be90: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
beb0: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
bec0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  ++;..    if( sql
bed0: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
bee0: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
bef0: 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f  100) ){ /* P4 */
bf00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bf10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
bf20: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
bf30: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
bf40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
bf50: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
bf60: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
bf70: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
bf80: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65  Op, pMem->z, pMe
bf90: 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20  m->szMalloc);.  
bfa0: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
bfb0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
bfc0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
bfd0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
bfe0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
bff0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c000: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
c010: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
c020: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
c030: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
c040: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
c050: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c060: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
c070: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
c080: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
c090: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
c0a0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
c0b0: 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a  ize(pMem, 4) ){.
c0c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c0d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
c0e0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
c0f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
c100: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
c110: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c120: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c130: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
c140: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
c150: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
c160: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
c170: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
c180: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
c190: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
c1a0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
c1b0: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
c1c0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
c1d0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
c1e0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
c1f0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
c200: 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a  e(pMem, 500) ){.
c210: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c220: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
c230: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
c240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
c250: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
c260: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c270: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c280: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
c290: 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  = displayComment
c2a0: 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d  (pOp, zP4, pMem-
c2b0: 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20  >z, 500);.      
c2c0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
c2d0: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
c2e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
c2f0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
c320: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
c330: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
c340: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
c350: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
c360: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
c370: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d  >aMem[1];.    p-
c380: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
c390: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c3a0: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
c3b0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
c3c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
c3d0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
c3e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
c3f0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
c400: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
c410: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
c420: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
c430: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c440: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
c450: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
c460: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
c470: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
c480: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
c490: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
c4a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
c4b0: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
c4c0: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
c4d0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
c4e0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
c4f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
c500: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
c510: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
c520: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
c530: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
c540: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
c550: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
c560: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
c570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c580: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
c590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
c5a0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
c5b0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
c5c0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
c5d0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
c5e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c5f0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
c600: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
c610: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
c620: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
c630: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
c640: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c650: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
c660: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
c670: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
c680: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
c690: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
c6a0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
c6b0: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
c6c0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
c6d0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
c6e0: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
c6f0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
c700: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
c710: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
c720: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
c730: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
c740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
c750: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
c760: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
c770: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
c780: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
c790: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
c7a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7b0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
c7c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c7d0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
c7e0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
c7f0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
c800: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
c810: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
c820: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
c830: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
c840: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
c850: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
c860: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e  d size buffer an
c870: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
c880: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70  er to.** that sp
c890: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ace.  If insuffi
c8a0: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61  cient space is a
c8b0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
c8c0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
c8d0: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20   pBuf parameter 
c8e0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
c8f0: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65  alue of a pointe
c900: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20  r which will.** 
c910: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20  receive the new 
c920: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73  memory.  pBuf is
c930: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20   normally NULL. 
c940: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a   If pBuf is not.
c950: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ** NULL, it mean
c960: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70  s that memory sp
c970: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
c980: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
c990: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  nd that.** this 
c9a0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
c9b0: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20  ot allocate any 
c9c0: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  new memory.  Whe
c9d0: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  n pBuf is not.**
c9e0: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74   NULL simply ret
c9f0: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20  urn pBuf.  Only 
ca00: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  allocate new mem
ca10: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70  ory space when p
ca20: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Buf.** is NULL..
ca30: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74  **.** nByte is t
ca40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
ca50: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64  es of space need
ca60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f  ed..**.** *ppFro
ca70: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69  m points to avai
ca80: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
ca90: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
caa0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
cab0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
cac0: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73  .  When space is
cad0: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46   allocated, *ppF
cae0: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20  rom is advanced 
caf0: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  past.** the end 
cb00: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
cb10: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
cb20: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
cb30: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
cb40: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
cb50: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
cb60: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
cb70: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
cb80: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
cb90: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
cba0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
cbb0: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
cbc0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
cbd0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
cbe0: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
cbf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
cc00: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
cc10: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
cc20: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
cc30: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
cc40: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
cc50: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
cc60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cc70: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
cc80: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72  e */.  u8 **ppFr
cc90: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
cca0: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20  N/OUT: Allocate 
ccb0: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a  from *ppFrom */.
ccc0: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20    u8 *pEnd,     
ccd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
cce0: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  r to 1 byte past
ccf0: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46   the end of *ppF
cd00: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  rom buffer */.  
cd10: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20  int *pnByte     
cd20: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63       /* If alloc
cd30: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
cd40: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20  made, increment 
cd50: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20  *pnByte */.){.  
cd60: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
cd70: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70  TE_ALIGNMENT(*pp
cd80: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
cd90: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75  Buf ) return pBu
cda0: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
cdb0: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  ND8(nByte);.  if
cdc0: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79  ( &(*ppFrom)[nBy
cdd0: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20  te] <= pEnd ){. 
cde0: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
cdf0: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70  )*ppFrom;.    *p
ce00: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a  pFrom += nByte;.
ce10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
ce20: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Byte += nByte;. 
ce30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66   }.  return pBuf
ce40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
ce50: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
ce60: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
ce70: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
ce80: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
ce90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
cea0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
ceb0: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
cec0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
ced0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
cee0: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
cef0: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
cf00: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
cf10: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
cf20: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
cf30: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
cf40: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
cf50: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
cf60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
cf70: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
cf80: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
cf90: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
cfa0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
cfb0: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
cfc0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
cfd0: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
cfe0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
cff0: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d  for(i=1; i<p->nM
d000: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
d010: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
d020: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
d030: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
d040: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
d050: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
d060: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
d070: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61  E_Abort;.  p->ma
d080: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
d090: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
d0a0: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
d0b0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
d0c0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
d0d0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
d0e0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
d0f0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
d100: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
d110: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
d120: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
d130: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
d140: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
d150: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
d160: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
d170: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
d180: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
d190: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
d1a0: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
d1b0: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
d1c0: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
d1d0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
d1e0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
d1f0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
d200: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
d210: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
d220: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
d230: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
d240: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
d250: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
d260: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
d270: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
d280: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
d290: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
d2a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d2b0: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
d2c0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
d2d0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
d2e0: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
d2f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d300: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
d310: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
d320: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
d330: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
d340: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d350: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
d360: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
d370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
d380: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
d390: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
d3a0: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
d3b0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
d3c0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
d3d0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
d3e0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
d3f0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
d400: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
d410: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
d420: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
d430: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
d440: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
d450: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
d460: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
d470: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
d480: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
d490: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
d4a0: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
d4b0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
d4c0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
d4d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
d4e0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
d4f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
d500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d510: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
d520: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
d530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d540: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d550: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d570: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
d580: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
d590: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d5c0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
d5d0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
d600: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
d610: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
d620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d630: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d640: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
d650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d680: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
d690: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
d6a0: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
d6d0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
d6e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d710: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
d720: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
d740: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
d750: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
d760: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
d790: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
d7a0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
d7b0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
d7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
d7d0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
d7e0: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
d7f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
d800: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
d810: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
d820: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
d830: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
d840: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
d850: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
d860: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
d870: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
d880: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
d890: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
d8a0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
d8b0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
d8c0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
d8d0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
d8e0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
d8f0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
d900: 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20  xArg;.  nOnce = 
d910: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20  pParse->nOnce;. 
d920: 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20   if( nOnce==0 ) 
d930: 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e  nOnce = 1; /* En
d940: 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  sure at least on
d950: 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e  e byte in p->aOn
d960: 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20  ceFlag[] */.  . 
d970: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
d980: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
d990: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
d9a0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
d9b0: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
d9c0: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
d9d0: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
d9e0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
d9f0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
da00: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
da10: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
da20: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
da30: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
da40: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
da50: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
da60: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
da70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
da80: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
da90: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
daa0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
dab0: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
dac0: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
dad0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
dae0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
daf0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
db00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
db10: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
db20: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
db30: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
db40: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
db50: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
db60: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
db70: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
db80: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
db90: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
dba0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
dbb0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a  n arguments in..
dbc0: 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75    */.  zCsr = (u
dbd0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  8*)&p->aOp[p->nO
dbe0: 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  p];            /
dbf0: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
dc00: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
dc10: 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75  n */.  zEnd = (u
dc20: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73  8*)&p->aOp[pPars
dc30: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  e->nOpAlloc];  /
dc40: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
dc50: 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20  t end of zCsr[] 
dc60: 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  */..  resolveP2V
dc70: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
dc80: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
dc90: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
dca0: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
dcb0: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
dcc0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
dcd0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
dce0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
dcf0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
dd00: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
dd10: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a   zEnd-zCsr);.  z
dd20: 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28  Csr += (zCsr - (
dd30: 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65  u8*)0)&7;.  asse
dd40: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
dd50: 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29  LIGNMENT(zCsr) )
dd60: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
dd70: 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72 65   0;..  p->expire
dd80: 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 4d  d = 0;.  .  /* M
dd90: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
dda0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
ddb0: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
ddc0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
ddd0: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
dde0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
ddf0: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
de00: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
de10: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
de20: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
de30: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
de40: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
de50: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
de60: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
de70: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
de80: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
de90: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
dea0: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
deb0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
dec0: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
ded0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
dee0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
def0: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
df00: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
df10: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
df20: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
df30: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
df40: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
df50: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
df60: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
df70: 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  tly.  ** reduce 
df80: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
df90: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
dfa0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
dfb0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  t..  */.  do {. 
dfc0: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
dfd0: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
dfe0: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
dff0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
e000: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
e010: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
e020: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
e030: 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73  (p->aVar, nVar*s
e040: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
e050: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
e060: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
e070: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
e080: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
e090: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
e0a0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
e0b0: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
e0c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
e0d0: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
e0e0: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
e0f0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
e100: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
e110: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
e120: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
e130: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
e160: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
e170: 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
e180: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
e190: 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c  OnceFlag, nOnce,
e1a0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
e1b0: 42 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51  Byte);.#ifdef SQ
e1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
e1d0: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
e1e0: 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f  p->anExec = allo
e1f0: 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63  cSpace(p->anExec
e200: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
e210: 69 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  i64), &zCsr, zEn
e220: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64  d, &nByte);.#end
e230: 69 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  if.    if( nByte
e240: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72   ){.      p->pFr
e250: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
e260: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
e270: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  te);.    }.    z
e280: 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a  Csr = p->pFree;.
e290: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
e2a0: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c  [nByte];.  }whil
e2b0: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
e2c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e2d0: 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ..  p->nCursor =
e2e0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e   nCursor;.  p->n
e2f0: 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65  OnceFlag = nOnce
e300: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20  ;.  if( p->aVar 
e310: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
e320: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
e330: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
e340: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; n++){.      p
e350: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
e360: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
e370: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
e380: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
e390: 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26    if( p->azVar &
e3a0: 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e  & pParse->nzVar>
e3b0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61  0 ){.    p->nzVa
e3c0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61  r = pParse->nzVa
e3d0: 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  r;.    memcpy(p-
e3e0: 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  >azVar, pParse->
e3f0: 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a  azVar, p->nzVar*
e400: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b  sizeof(p->azVar[
e410: 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  0]));.    memset
e420: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20  (pParse->azVar, 
e430: 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  0, pParse->nzVar
e440: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
e450: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a  azVar[0]));.  }.
e460: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
e470: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20  .    p->aMem--; 
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
e4a0: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
e4b0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   */.    p->nMem 
e4c0: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
e4e0: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
e4f0: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  m-1 */.    for(n
e500: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
e510: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
e520: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
e530: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20  Undefined;.     
e540: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
e550: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e560: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50   p->explain = pP
e570: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20  arse->explain;. 
e580: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
e590: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
e5a0: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
e5b0: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
e5c0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
e5d0: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
e5e0: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
e5f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
e600: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
e610: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
e620: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
e630: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
e640: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
e650: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43  lite3VdbeSorterC
e660: 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29  lose(p->db, pCx)
e670: 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  ;.  if( pCx->pBt
e680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
e690: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
e6a0: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
e6b0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
e6c0: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
e6d0: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
e6e0: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
e6f0: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
e700: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
e710: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
e730: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
e740: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
e750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e760: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e770: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 43 78 2d  .  else if( pCx-
e780: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
e790: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
e7a0: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
e7b0: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
e7c0: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
e7d0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
e7e0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  e *pModule = pVt
e7f0: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d  abCursor->pVtab-
e800: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73  >pModule;.    as
e810: 73 65 72 74 28 20 70 56 74 61 62 43 75 72 73 6f  sert( pVtabCurso
e820: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
e830: 20 29 3b 0a 20 20 20 20 70 56 74 61 62 43 75 72   );.    pVtabCur
e840: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  sor->pVtab->nRef
e850: 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d  --;.    pModule-
e860: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
e870: 73 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sor);.  }.#endif
e880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e890: 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
e8a0: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
e8b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e8c0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
e8d0: 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
e8e0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
e8f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
e910: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
e920: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
e930: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
e940: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
e950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e960: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
e970: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
e980: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
e990: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e9a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
e9b0: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
e9c0: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
e9d0: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
e9e0: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
e9f0: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
ea00: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
ea10: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
ea20: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
ea30: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
ea40: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
ea50: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
ea60: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
ea70: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
ea80: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
ea90: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
eaa0: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
eab0: 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
eac0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ead0: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
eae0: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
eaf0: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
eb00: 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65  endif.  v->aOnce
eb10: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Flag = pFrame->a
eb20: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e  OnceFlag;.  v->n
eb30: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
eb40: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->nOnceFlag;.  
eb50: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
eb60: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
eb70: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
eb80: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
eb90: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
eba0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
ebb0: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
ebc0: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
ebd0: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
ebe0: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
ebf0: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
ec00: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
ec10: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
ec20: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
ec30: 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
ec40: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
ec50: 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72 65  >nDbChange;.  re
ec60: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ec80: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
ec90: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
eca0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
ecb0: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
ecc0: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
ecd0: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
ece0: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
ecf0: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
ed00: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
ed10: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
ed20: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
ed30: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
ed40: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
ed50: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
ed60: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
ed70: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
ed80: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
ed90: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
eda0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
edb0: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
edc0: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
edd0: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
ede0: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
edf0: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
ee00: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
ee10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee20: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
ee30: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
ee40: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
ee50: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
ee60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
ee70: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
ee80: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
ee90: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
eea0: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
eeb0: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
eec0: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  m[1], p->nMem);.
eed0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
eee0: 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
eef0: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
ef00: 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
ef10: 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
ef20: 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
ef30: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
ef40: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
ef50: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  el);.  }..  /* D
ef60: 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74  elete any auxdat
ef70: 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61  a allocations ma
ef80: 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a  de by the VM */.
ef90: 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74    if( p->pAuxDat
efa0: 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  a ) sqlite3VdbeD
efb0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20  eleteAuxData(p, 
efc0: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
efd0: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
efe0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
eff0: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
f000: 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e  er a single run.
f010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f020: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
f030: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f040: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
f050: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f060: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
f070: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
f080: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
f090: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
f0a0: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
f0b0: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
f0c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
f0d0: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
f0e0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
f0f0: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
f100: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
f110: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
f120: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
f130: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
f140: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
f150: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
f160: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
f170: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
f180: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
f190: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
f1a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
f1b0: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
f1c0: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
f1d0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
f1e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
f1f0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
f200: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
f210: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f220: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
f230: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
f240: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
f250: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
f260: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
f270: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
f280: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
f290: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
f2a0: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
f2b0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
f2c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
f2d0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
f2e0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
f2f0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
f300: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
f310: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
f320: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
f330: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
f340: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
f350: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
f360: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
f370: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
f380: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
f390: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f3a0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
f3b0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
f3c0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
f3d0: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
f3e0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
f3f0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
f400: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
f410: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
f420: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
f430: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
f440: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
f450: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
f460: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
f470: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
f480: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
f490: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
f4a0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
f4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
f4c0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
f4d0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
f4e0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
f4f0: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
f500: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
f510: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
f520: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
f530: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
f540: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
f550: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
f560: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
f570: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
f580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
f590: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
f5a0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
f5b0: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
f5c0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
f5d0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
f5e0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
f5f0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
f600: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
f610: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
f620: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
f630: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
f640: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
f650: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
f660: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
f670: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
f680: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
f6b0: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
f6c0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
f6f0: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
f700: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
f710: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f730: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
f740: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
f750: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f760: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
f770: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f780: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
f790: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
f7a0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
f7b0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
f7c0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
f7d0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
f7e0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
f7f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
f800: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
f810: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
f820: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
f830: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
f840: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
f850: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f860: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
f870: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
f880: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
f890: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f8a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
f8b0: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
f8c0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
f8d0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
f8e0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
f8f0: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
f900: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
f910: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
f920: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
f930: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
f940: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
f950: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
f960: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
f970: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
f980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f990: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
f9a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
f9b0: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
f9c0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
f9d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
f9e0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
f9f0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
fa00: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
fa10: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
fa20: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
fa30: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
fa40: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
fa50: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
fa60: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
fa70: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
fa80: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
fa90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
faa0: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
fab0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
fac0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
fad0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
fae0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
faf0: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
fb00: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
fb10: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
fb20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
fb30: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
fb40: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
fb50: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fb60: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
fb70: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
fb80: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
fb90: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
fba0: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
fbb0: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
fbc0: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
fbd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fbe0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
fbf0: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
fc00: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
fc10: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
fc20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
fc30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
fc40: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
fc50: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
fc60: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
fc70: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
fc80: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
fc90: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
fca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fcb0: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
fcc0: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
fcd0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
fce0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
fcf0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
fd00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
fd20: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
fd30: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
fd40: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
fd50: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
fd60: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
fd70: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
fd80: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
fd90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
fda0: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
fdb0: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
fdc0: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
fdd0: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
fde0: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
fdf0: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
fe00: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
fe10: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
fe20: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
fe30: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
fe40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
fe50: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
fe60: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
fe70: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
fe80: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
fe90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
fea0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
feb0: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
fec0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fed0: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
fee0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
fef0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
ff00: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
ff10: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
ff20: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
ff30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ff40: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
ff50: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ff60: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
ff70: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
ff80: 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pBt));.      sql
ff90: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ffa0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
ffb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ffc0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
ffd0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
ffe0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
fff0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10000 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
10010 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
10020 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
10030 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10040 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10050 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10060 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10070 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10080 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
100a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
100b0 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
100c0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
100d0 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
100e0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
100f0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
10100 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
10110 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
10120 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
10130 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10140 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10150 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10160 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
10170 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
10180 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
10190 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
101a0 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
101b0 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
101c0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
101d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
101e0 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
101f0 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
10200 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
10210 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
10220 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
10230 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
10240 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
10250 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
10260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
10270 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
10280 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10290 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
102a0 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
102b0 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
102c0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
102d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
102e0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
102f0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10300 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10310 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10320 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10330 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10340 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
10350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10360 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
10370 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
10380 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
10390 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
103a0 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
103b0 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
103c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
103d0 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
103e0 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
103f0 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
10400 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
10410 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
10420 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
10430 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
10440 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
10450 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
10460 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
10470 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
10480 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
10490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
104a0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
104b0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
104c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
104d0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
104e0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
104f0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10510 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
10520 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
10530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10550 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10560 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10570 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10580 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
10590 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
105a0 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
105b0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
105c0 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
105d0 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
105e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
105f0 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
10600 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
10610 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
10620 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
10630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
10640 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
10650 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10660 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
10670 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
10680 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
10690 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
106a0 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
106b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
106c0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
106d0 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
106e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
106f0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
10700 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
10710 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
10720 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
10730 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
10740 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
10750 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
10760 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
10770 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
10780 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
10790 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
107a0 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
107b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
107c0 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
107d0 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
107e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
107f0 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
10800 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
10810 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
10820 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10830 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
10840 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
10850 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
10860 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
10870 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10880 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
10890 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
108a0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
108b0 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
108c0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
108d0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
108e0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
108f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
10900 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
10910 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
10920 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
10930 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10940 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
10950 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
10960 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
10970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10980 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
10990 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
109a0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
109b0 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
109c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
109d0 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
109e0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
109f0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
10a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
10a30 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
10a40 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
10a50 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
10a60 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
10a70 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10a80 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
10a90 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
10aa0 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
10ab0 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
10ac0 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
10ad0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10ae0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
10af0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
10b00 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
10b10 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
10b20 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
10b30 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b50 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
10b60 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
10b70 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
10b80 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
10b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10ba0 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
10bb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10bc0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
10bd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10be0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
10bf0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
10c00 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
10c10 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
10c20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
10c30 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
10c40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
10c50 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
10c60 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
10c70 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
10c80 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
10c90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10ca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10cc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10cd0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10cf0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
10d00 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
10d10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d20 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
10d30 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
10d40 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
10d50 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
10d60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
10d70 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
10d80 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
10d90 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10da0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
10db0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
10dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
10dd0 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
10de0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
10df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
10e00 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
10e10 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
10e20 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
10e30 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
10e40 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
10e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10e60 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10e70 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10e80 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10e90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10ea0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
10eb0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
10ec0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
10ed0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
10ee0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
10ef0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
10f00 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
10f10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
10f20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
10f30 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
10f40 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
10f50 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
10f60 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
10f70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
10f80 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
10f90 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
10fa0 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
10fb0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
10fc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
10fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10fe0 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
10ff0 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
11000 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
11010 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
11020 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
11030 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11040 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
11050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11070 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11080 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11090 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
110a0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
110b0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
110c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
110d0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
110e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
110f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11110 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
11120 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11130 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
11140 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
11150 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
11160 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
11170 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
11180 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
11190 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
111a0 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
111b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
111c0 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
111d0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
111e0 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
111f0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
11200 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
11210 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
11220 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
11230 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11240 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
11260 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11270 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11280 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11290 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
112a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
112b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
112c0 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
112d0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
112e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
112f0 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
11300 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
11310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11320 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
11330 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
11340 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
11350 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
11360 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
11370 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11380 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
11390 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
113a0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
113b0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
113c0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
113d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
113e0 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
113f0 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
11400 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
11410 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11420 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
11430 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
11440 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
11450 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
11460 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11470 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
11480 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
11490 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
114a0 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
114b0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
114c0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
114d0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
114e0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
114f0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
11500 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11510 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11520 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11540 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11550 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
11560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11570 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11580 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11590 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
115a0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
115b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
115c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
115d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
115e0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
115f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11600 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
11610 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11620 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
11630 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
11640 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
11650 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
11660 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
11670 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
11680 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
11690 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
116a0 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
116b0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
116c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
116d0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
116e0 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63  Master, needSync
116f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11700 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11710 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
11720 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
11730 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
11740 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
11750 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
11760 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
11770 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11780 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
11790 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
117a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
117b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
117c0 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
117d0 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
117e0 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
117f0 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
11800 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
11810 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
11820 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
11830 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
11840 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
11850 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
11860 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
11870 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
11880 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
11890 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
118a0 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
118b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
118c0 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
118d0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
118e0 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
118f0 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
11900 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
11910 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
11930 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
11940 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11950 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11960 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
11970 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11980 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11990 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
119a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
119b0 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
119c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
119d0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
119e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
119f0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
11a00 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11a10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
11a20 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
11a30 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
11a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
11a50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
11a60 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
11a70 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
11a80 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
11a90 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
11aa0 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
11ab0 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
11ac0 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
11ad0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
11ae0 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
11af0 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
11b00 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
11b10 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
11b20 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
11b30 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
11b40 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
11b50 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
11b60 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
11b70 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
11b80 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
11b90 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
11ba0 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
11bb0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
11bc0 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
11bd0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
11be0 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
11bf0 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
11c00 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
11c10 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
11c20 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
11c30 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  p ){.    if( sql
11c40 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28  ite3_stmt_busy((
11c50 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
11c60 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
11c70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
11c80 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
11c90 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
11ca0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
11cb0 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
11cc0 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
11cd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
11ce0 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
11cf0 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
11d00 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
11d10 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
11d20 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
11d30 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
11d40 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
11d50 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
11d60 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11d70 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
11d80 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
11d90 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
11da0 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
11db0 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
11dc0 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
11dd0 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
11de0 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
11df0 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
11e00 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
11e10 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
11e20 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
11e30 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
11e40 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
11e50 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11e60 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
11e70 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
11e80 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
11e90 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11ea0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
11eb0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
11ec0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
11ed0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
11ee0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11ef0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
11f00 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
11f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11f20 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
11f30 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
11f40 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
11f50 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
11f60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
11f70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
11f80 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
11f90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
11fa0 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
11fb0 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
11fc0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
11fd0 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
11fe0 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
11ff0 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
12000 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
12010 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
12020 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
12030 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
12040 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
12050 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
12060 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
12070 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
12080 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
12090 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
120a0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
120b0 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
120c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
120d0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
120e0 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
120f0 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
12100 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
12110 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12120 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
12130 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
12140 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
12150 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
12160 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
12170 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
12180 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
12190 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
121a0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
121b0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
121c0 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
121d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
121e0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
121f0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12200 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12210 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
12220 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12230 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
12240 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
12250 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
12260 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
12270 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12290 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
122a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
122b0 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
122c0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
122d0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
122e0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
122f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12320 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
12330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12340 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
12350 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
12360 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
12370 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
12390 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
123a0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
123b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
123c0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
123d0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
123e0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
123f0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
12400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12420 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
12430 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
12440 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12450 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12470 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
12480 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12490 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
124a0 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
124b0 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
124c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
124d0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
124e0 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
124f0 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
12500 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
12510 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
12520 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
12530 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
12540 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12550 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12560 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
12570 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
12580 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
12590 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
125a0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
125b0 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
125c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
125d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
125e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
125f0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
12600 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
12610 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
12620 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
12630 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
12640 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
12650 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
12660 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
12670 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
12680 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
12690 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
126a0 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
126b0 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
126c0 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
126d0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
126e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
126f0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
12700 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
12710 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
12720 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
12730 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
12740 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
12750 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
12760 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
12770 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
12780 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
12790 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
127a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
127b0 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
127c0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
127d0 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
127e0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
127f0 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
12800 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
12810 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
12820 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
12830 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12840 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
12850 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
12860 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
12870 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
12880 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
12890 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
128a0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
128b0 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
128c0 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
128d0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
128e0 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45  beError(p, "FORE
128f0 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
12900 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
12910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12920 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
12930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12940 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12950 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12960 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
12970 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
12980 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
12990 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
129a0 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
129b0 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
129c0 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
129d0 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
129e0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
129f0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
12a00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
12a10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12a20 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
12a30 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
12a40 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
12a50 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
12a60 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
12a70 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
12a80 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
12a90 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
12aa0 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
12ab0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
12ac0 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
12ad0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
12ae0 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
12af0 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
12b00 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
12b10 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
12b20 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
12b30 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
12b40 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
12b50 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
12b60 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
12b70 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
12b80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
12b90 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
12ba0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
12bb0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
12bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
12be0 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
12bf0 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
12c00 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
12c10 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
12c20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12c30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
12c40 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
12c50 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
12c60 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
12c70 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
12c80 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
12c90 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
12ca0 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
12cb0 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
12cc0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
12cd0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
12ce0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
12cf0 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
12d00 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
12d10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
12d20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
12d30 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
12d40 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
12d50 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
12d60 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
12d70 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
12d80 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
12d90 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
12da0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
12db0 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
12dc0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
12dd0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
12de0 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
12df0 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
12e00 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
12e10 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
12e20 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
12e30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
12e40 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
12e50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12e60 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12e70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12e80 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65  }.  if( p->aOnce
12e90 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d  Flag ) memset(p-
12ea0 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70  >aOnceFlag, 0, p
12eb0 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20  ->nOnceFlag);.  
12ec0 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
12ed0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
12ee0 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
12ef0 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
12f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12f10 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
12f20 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
12f30 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
12f40 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
12f50 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
12f60 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
12f70 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
12f80 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
12f90 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
12fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12fb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
12fc0 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
12fd0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
12fe0 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
12ff0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
13000 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
13010 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
13020 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
13030 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
13040 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
13050 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
13060 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
13070 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
13080 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
13090 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
130a0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
130b0 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
130c0 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
130d0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
130e0 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
130f0 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
13100 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
13110 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
13120 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
13130 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
13150 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
13160 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
13170 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13180 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
13190 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
131a0 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
131b0 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
131c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
131d0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
131e0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
131f0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
13200 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
13210 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
13220 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
13230 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
13240 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
13250 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
13260 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
13270 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
13280 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
13290 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
132a0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
132b0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
132c0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
132d0 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
132e0 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
132f0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
13300 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
13310 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
13320 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
13330 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
13340 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
13350 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
13360 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
13370 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
13380 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
13390 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
133a0 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
133b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
133c0 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
133d0 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
133e0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
133f0 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
13400 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
13410 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13420 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13430 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
13440 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
13450 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
13460 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
13470 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13480 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
13490 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
134a0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
134b0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
134c0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
134d0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
134e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
134f0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
13500 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
13510 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
13520 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
13530 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
13540 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
13550 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
13560 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
13570 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
13580 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
13590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
135a0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
135b0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
135c0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
135d0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
135e0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
135f0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
13600 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13610 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
13620 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
13630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13640 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13650 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
13660 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
13670 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
13680 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
136a0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
136b0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
136c0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
136d0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
136e0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
136f0 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
13700 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
13710 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
13720 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
13730 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
13740 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
13750 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
13760 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
13770 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
13780 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13790 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
137a0 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
137b0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
137c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
137d0 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
137e0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
137f0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
13800 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
13810 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
13820 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
13830 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13840 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
13850 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
13860 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
13870 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
13880 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13890 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
138a0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
138b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
138c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
138d0 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
138e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
138f0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
13900 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13920 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
13930 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
13940 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
13950 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
13960 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
13970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13980 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13990 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
139a0 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
139b0 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
139c0 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
139d0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
139e0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
139f0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
13a00 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
13a10 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
13a20 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
13a30 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
13a40 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
13a50 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
13a60 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
13a70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
13a80 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
13a90 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
13aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13ab0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
13ac0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
13ad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13ae0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13af0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13b00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
13b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13b30 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
13b40 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
13b50 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
13b60 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
13b70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
13b80 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ba0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
13bb0 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
13bc0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
13bd0 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
13be0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
13bf0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
13c00 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
13c10 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
13c20 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
13c30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
13c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13c50 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13c60 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13c70 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
13c80 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
13c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
13ca0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
13cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13cc0 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
13cd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
13ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
13cf0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
13d00 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
13d10 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
13d20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
13d30 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
13d40 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
13d50 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
13d60 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
13d70 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
13d80 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
13d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13da0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13db0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
13dc0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
13dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
13de0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
13df0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
13e00 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
13e10 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13e20 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
13e30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
13e40 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
13e50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13e60 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
13e70 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
13e80 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
13e90 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13ea0 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
13eb0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
13ec0 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
13ed0 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
13ee0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
13ef0 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
13f00 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
13f10 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
13f20 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
13f30 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
13f40 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
13f50 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
13f60 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
13f70 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
13f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13f90 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
13fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13fb0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
13fc0 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
13fd0 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
13fe0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
13ff0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14000 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
14010 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
14020 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
14030 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
14040 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14050 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14060 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
14070 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
14080 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14090 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
140a0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
140b0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
140c0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
140d0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
140e0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
140f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14100 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
14110 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14120 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14130 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
14140 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
14150 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
14160 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14170 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
14180 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
14190 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
141a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
141b0 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
141c0 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
141d0 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
141e0 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
141f0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
14200 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14210 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
14220 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
14230 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
14240 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
14250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14260 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
14270 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
14280 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14290 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
142a0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
142b0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
142c0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
142d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
142e0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
142f0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
14300 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
14310 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
14320 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
14330 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
14340 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
14350 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
14360 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
14370 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
14380 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
14390 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
143a0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
143b0 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
143c0 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
143d0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
143e0 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
143f0 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
14400 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
14410 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
14420 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
14430 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
14440 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
14450 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
14460 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14470 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14480 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
14490 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
144a0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
144b0 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
144c0 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
144d0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
144e0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
144f0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
14500 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
14510 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
14520 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
14530 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
14540 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
14550 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
14560 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
14570 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
14580 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14590 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
145a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
145b0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
145c0 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
145d0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
145e0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
145f0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
14600 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
14610 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
14620 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
14630 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
14640 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14650 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
14660 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
14670 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
14680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
14690 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
146a0 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
146b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
146c0 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
146d0 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
146e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
146f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
14700 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
14710 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
14720 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
14730 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
14740 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
14750 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
14760 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
14770 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
14780 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
14790 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
147a0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
147b0 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
147c0 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
147d0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
147e0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
147f0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
14800 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
14810 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
14820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14830 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
14840 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
14850 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
14860 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14870 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
14880 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
14890 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
148a0 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
148b0 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
148c0 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
148d0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
148e0 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
148f0 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
14900 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
14910 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
14920 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14930 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
14940 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
14950 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
14960 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
14970 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14980 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
14990 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
149a0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
149b0 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
149c0 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
149d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
149e0 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
149f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
14a00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14a10 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
14a20 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
14a30 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
14a40 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
14a50 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
14a60 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
14a70 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
14a80 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
14a90 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
14aa0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
14ab0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
14ac0 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
14ad0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
14ae0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
14af0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
14b00 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
14b10 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
14b20 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
14b30 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
14b40 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
14b50 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
14b60 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
14b70 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
14b80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14b90 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
14ba0 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
14bb0 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
14bc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14bd0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
14be0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
14bf0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
14c00 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
14c10 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
14c20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
14c30 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
14c40 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
14c50 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
14c60 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
14c70 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
14c80 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
14c90 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
14ca0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
14cb0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
14cc0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
14cd0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
14ce0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
14cf0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
14d00 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
14d10 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
14d20 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
14d30 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
14d40 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
14d50 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
14d60 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
14d70 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
14d80 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
14d90 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
14da0 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
14db0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
14dc0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
14dd0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
14de0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
14df0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
14e00 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
14e10 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
14e20 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
14e30 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
14e40 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
14e50 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
14e60 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
14e70 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
14e80 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
14e90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
14ea0 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
14eb0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
14ec0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
14ed0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
14ee0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
14ef0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
14f00 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
14f10 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
14f20 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
14f30 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
14f40 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
14f50 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
14f60 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
14f70 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
14f80 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
14f90 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
14fa0 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
14fb0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
14fc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
14fd0 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
14fe0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
14ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
15000 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
15010 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15020 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
15030 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
15040 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
15050 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
15060 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
15070 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
15080 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
15090 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
150a0 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
150b0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
150c0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
150d0 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
150e0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
150f0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
15100 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
15110 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
15120 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
15130 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15140 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15150 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15160 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15170 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15180 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15190 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
151a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
151b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
151c0 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
151d0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
151e0 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
151f0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
15200 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
15210 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
15220 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
15230 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15240 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15250 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15260 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15270 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15280 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15290 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
152a0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
152b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
152c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
152d0 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
152e0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
152f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15300 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
15310 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
15320 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
15330 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15340 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
15350 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
15360 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
15370 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
15380 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15390 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
153a0 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
153b0 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
153c0 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
153d0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
153e0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
153f0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
15400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
15410 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
15420 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
15430 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15440 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
15450 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
15460 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
15470 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
15480 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
15490 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
154a0 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
154b0 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
154c0 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
154d0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
154e0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
154f0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15510 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
15520 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
15530 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
15540 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
15550 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15560 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
15570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15580 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
15590 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
155a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
155b0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
155c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
155d0 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
155e0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
155f0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
15600 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
15610 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
15620 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
15630 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
15640 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
15650 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
15660 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
15670 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
15680 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
15690 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
156a0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
156b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
156c0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
156d0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
156e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
156f0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
15700 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
15710 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
15720 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
15730 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15740 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
15750 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
15760 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
15770 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15780 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
15790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
157a0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
157b0 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
157c0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
157d0 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
157e0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
157f0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
15800 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
15810 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
15820 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
15830 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15840 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
15850 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
15860 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
15870 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
15880 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
15890 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
158a0 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
158b0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
158c0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
158d0 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
158e0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
158f0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
15900 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
15910 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
15920 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
15930 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
15940 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
15950 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
15960 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
15970 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
15980 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
15990 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
159a0 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
159b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
159c0 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
159d0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
159e0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
159f0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
15a00 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
15a10 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
15a20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
15a30 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15a40 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
15a50 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
15a60 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
15a70 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
15a80 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
15a90 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
15aa0 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
15ab0 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
15ac0 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
15ad0 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
15ae0 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
15af0 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
15b00 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
15b10 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
15b20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
15b30 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
15b40 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
15b50 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
15b60 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
15b70 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
15b80 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
15b90 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
15ba0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15bb0 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
15bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15bd0 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
15be0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
15bf0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
15c00 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
15c10 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
15c20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15c30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
15c40 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
15c50 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
15c60 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
15c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
15c80 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
15c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
15ca0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15cb0 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
15cc0 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
15cd0 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
15ce0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
15cf0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
15d00 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
15d10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15d20 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
15d30 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
15d40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15d50 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
15d60 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
15d70 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
15d80 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
15d90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
15da0 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
15db0 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
15dc0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
15dd0 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
15de0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
15df0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
15e00 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
15e10 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
15e20 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
15e30 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
15e40 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
15e50 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
15e60 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
15e70 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
15e80 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
15e90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15ea0 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
15eb0 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
15ec0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
15ed0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15ee0 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
15ef0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
15f00 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
15f10 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
15f20 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
15f30 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
15f40 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
15f50 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
15f60 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
15f70 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
15f80 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
15f90 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
15fa0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
15fb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
15fc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
15fd0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
15fe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
15ff0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16000 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
16010 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16020 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16030 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16040 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16050 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16060 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16070 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16080 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16090 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
160a0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
160b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
160c0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
160d0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
160e0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
160f0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16100 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16110 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16120 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16130 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16140 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16150 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16160 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16170 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16180 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16190 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
161a0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
161b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
161c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
161d0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
161e0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
161f0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16200 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16210 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16220 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16230 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16240 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16250 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16260 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16270 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16280 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16290 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
162a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
162b0 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
162c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
162d0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
162e0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
162f0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16300 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16310 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16320 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
16330 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
16340 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
16350 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
16360 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
16370 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
16380 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16390 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
163a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
163b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
163c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
163d0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
163e0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
163f0 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
16400 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
16410 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
16420 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
16430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
16450 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
16460 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
16470 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
16480 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
16490 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
164a0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
164b0 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
164c0 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
164d0 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
164e0 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
164f0 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
16500 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
16510 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
16520 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
16530 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
16540 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
16550 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
16560 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
16570 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
16580 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
16590 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
165a0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
165b0 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
165c0 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
165d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
165e0 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
165f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75    assert( p->pCu
16600 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
16610 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
16620 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16630 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->pCursor) );. 
16640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16650 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
16660 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  p->pCursor, &isD
16670 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
16680 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
16690 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
166a0 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
166b0 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
166c0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
166d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
166e0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
166f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
16700 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
16710 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
16720 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
16730 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
16740 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
16750 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
16760 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
16770 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
16780 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
16790 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
167a0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
167b0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
167c0 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
167d0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
167e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
167f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
16800 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
16810 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
16820 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
16830 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
16840 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
16850 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
16860 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
16870 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
16880 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
16890 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
168a0 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
168b0 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
168c0 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
168d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
168e0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
168f0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
16900 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
16910 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
16920 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
16930 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
16940 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
16950 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
16960 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
16970 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
16980 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
16990 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
169a0 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
169b0 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
169c0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
169d0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
169e0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
169f0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
16a00 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
16a10 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
16a20 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
16a30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
16a40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16a50 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
16a60 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
16a70 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
16a80 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
16a90 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eto ){.    retur
16aa0 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
16ab0 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20  Moveto(p);.  }. 
16ac0 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20   if( p->pCursor 
16ad0 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  && sqlite3BtreeC
16ae0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
16af0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
16b00 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
16b10 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
16b20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16b30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16b40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
16b50 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
16b60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16b70 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
16b80 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16b90 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
16ba0 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
16bb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16bc0 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
16bd0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16be0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
16bf0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
16c00 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
16c10 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
16c20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
16c30 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
16c40 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
16c50 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
16c60 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
16c70 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
16c80 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
16c90 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
16ca0 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
16cb0 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
16cc0 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
16cd0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
16ce0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
16cf0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
16d00 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
16d10 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
16d20 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
16d30 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
16d40 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
16d50 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
16d60 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
16d70 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
16d80 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16d90 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
16da0 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
16db0 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
16dc0 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
16dd0 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
16de0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
16df0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
16e00 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
16e10 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
16e20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16e30 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
16e40 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
16e50 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
16e60 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
16e70 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
16e80 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
16e90 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
16eb0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16ec0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16ed0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
16f00 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
16f30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
16f40 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
16f50 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
16f60 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
16f70 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
16f80 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
16f90 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
16fa0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
16fb0 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
16fe0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
16ff0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
17000 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
17010 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17020 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17050 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17060 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17080 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
17090 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
170c0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
170d0 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17100 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17110 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
17140 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
17150 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
17160 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
17170 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
17180 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
17190 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
171a0 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
171b0 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
171c0 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
171d0 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
171e0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
171f0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
17200 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
17210 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
17220 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
17230 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
17240 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
17250 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
17260 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
17270 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
17280 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17290 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
172a0 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
172b0 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
172c0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
172d0 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
172e0 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
172f0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
17300 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
17310 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
17320 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
17330 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
17340 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
17350 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
17360 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
17370 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
17380 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
17390 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
173a0 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
173b0 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
173c0 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
173d0 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
173e0 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
173f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
17400 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
17410 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
17420 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
17430 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
17440 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
17450 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
17460 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
17470 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17480 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
17490 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
174a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
174b0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
174c0 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
174d0 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
174e0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
174f0 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
17500 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
17510 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
17520 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
17530 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
17540 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
17550 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
17560 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
17570 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
17580 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
17590 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
175a0 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
175b0 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
175c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
175d0 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
175e0 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
175f0 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
17600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
17610 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
17620 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
17630 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
17640 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
17650 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
17660 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
17670 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
17680 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
17690 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
176a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
176b0 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
176c0 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
176d0 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
176e0 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
176f0 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
17700 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
17710 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
17720 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
17730 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
17740 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
17750 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
17760 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
17770 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
17780 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
17790 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
177a0 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
177b0 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
177c0 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
177d0 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
177e0 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
177f0 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
17800 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
17810 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
17820 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
17830 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
17840 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
17850 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
17860 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
17870 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
17880 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
17890 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
178a0 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
178b0 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
178c0 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
178d0 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
178e0 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
178f0 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
17900 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
17910 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
17920 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
17930 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
17940 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
17950 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
17960 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
17970 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
17980 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
17990 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
179a0 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
179b0 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
179c0 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
179d0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
179e0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
179f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
17a00 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
17a10 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
17a20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17a30 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
17a40 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
17a50 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
17a60 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
17a70 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
17a80 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
17a90 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
17aa0 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
17ab0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
17ac0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17ad0 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
17ae0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
17af0 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
17b00 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17b10 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17b20 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
17b30 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
17b40 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
17b50 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
17b60 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
17b70 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
17b80 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
17b90 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
17ba0 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
17bb0 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
17bc0 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
17bd0 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
17be0 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
17bf0 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
17c00 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
17c10 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
17c20 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
17c30 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
17c40 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
17c50 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
17c60 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
17c70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
17c80 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
17c90 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
17ca0 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
17cb0 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
17cc0 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
17cd0 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
17ce0 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
17cf0 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
17d00 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
17d10 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
17d20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
17d30 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
17d40 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
17d50 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
17d60 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
17d70 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
17d80 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
17d90 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
17da0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
17db0 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
17dc0 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
17dd0 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
17de0 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
17df0 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
17e00 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
17e10 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
17e20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
17e30 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
17e40 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
17e50 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
17e60 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
17e70 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
17e80 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
17e90 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
17ea0 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
17eb0 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
17ec0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
17ed0 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
17ee0 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
17ef0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
17f00 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
17f10 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
17f20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
17f30 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
17f40 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
17f50 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
17f60 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
17f70 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
17f80 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
17f90 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
17fa0 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
17fb0 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
17fc0 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
17fd0 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
17fe0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
17ff0 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
18000 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18010 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
18020 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
18030 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
18040 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
18050 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
18060 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
18070 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
18080 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
18090 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
180a0 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
180b0 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
180c0 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
180d0 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
180e0 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
180f0 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
18100 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
18110 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
18120 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
18130 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
18140 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
18150 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
18160 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
18170 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
18180 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
18190 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
181a0 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
181b0 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
181c0 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
181d0 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
181e0 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
181f0 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
18200 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
18210 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
18220 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
18230 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
18240 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
18250 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
18260 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
18270 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
18280 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
18290 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
182a0 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
182b0 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
182c0 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
182d0 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
182e0 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
182f0 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
18300 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18310 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
18320 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
18330 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
18340 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
18350 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
18360 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
18370 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
18380 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
18390 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
183a0 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
183b0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
183c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
183d0 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
183e0 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
183f0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18400 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
18410 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
18420 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
18430 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
18440 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
18450 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
18460 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
18470 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
18480 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
18490 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
184a0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
184b0 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
184c0 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
184d0 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
184e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
184f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18500 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
18510 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
18520 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
18530 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
18540 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
18550 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
18560 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
18570 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
18580 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
18590 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
185a0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
185b0 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
185c0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
185d0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
185e0 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
185f0 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
18600 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
18610 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
18620 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
18630 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
18640 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
18650 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
18660 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
18670 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
18680 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
18690 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
186a0 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
186b0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
186c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
186d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
186e0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
186f0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
18700 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
18710 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18720 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
18730 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
18740 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
18750 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
18760 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
18770 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
18780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
18790 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
187a0 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
187b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
187c0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
187d0 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
187e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
187f0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
18800 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
18810 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
18820 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18830 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
18840 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
18850 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
18860 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
18870 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
18880 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
18890 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
188a0 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
188b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
188c0 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20   Input "x" is a 
188d0 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69  sequence of unsi
188e0 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20  gned characters 
188f0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61  that represent a
18900 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  .** big-endian i
18910 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20  nteger.  Return 
18920 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  the equivalent n
18930 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
18940 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54  .#define ONE_BYT
18950 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38  E_INT(x)    ((i8
18960 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65  )(x)[0]).#define
18970 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29   TWO_BYTE_INT(x)
18980 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78      (256*(i8)((x
18990 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64  )[0])|(x)[1]).#d
189a0 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45  efine THREE_BYTE
189b0 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a  _INT(x)  (65536*
189c0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
189d0 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29  )[1]<<8)|(x)[2])
189e0 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
189f0 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75  TE_UINT(x)  (((u
18a00 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
18a10 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
18a20 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
18a30 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
18a40 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32  E_INT(x) (167772
18a50 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  16*(i8)((x)[0])|
18a60 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
18a70 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
18a80 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
18a90 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
18aa0 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
18ab0 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
18ac0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
18ad0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
18ae0 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
18af0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18b00 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
18b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18b20 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
18b30 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61  nted as two sepa
18b40 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f  rate routines fo
18b50 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  r performance..*
18b60 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20  * The few cases 
18b70 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63  that require loc
18b80 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
18b90 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
18ba0 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72   a separate.** r
18bb0 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69  outine so that i
18bc0 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65  n most cases the
18bd0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76   overhead of mov
18be0 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f  ing the stack po
18bf0 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69  inter.** is avoi
18c00 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ded..*/ .static 
18c10 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  u32 SQLITE_NOINL
18c20 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20  INE serialGet(. 
18c30 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18c40 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
18c50 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
18c60 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
18c70 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
18c80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18c90 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
18ca0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
18cb0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
18ce0 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
18cf0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  nto */.){.  u64 
18d00 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
18d10 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79  NT(buf);.  u32 y
18d20 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
18d30 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20  T(buf+4);.  x = 
18d40 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69  (x<<32) + y;.  i
18d50 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
18d60 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  6 ){.    /* EVID
18d70 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31  ENCE-OF: R-29851
18d80 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20  -52272 Value is 
18d90 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d  a big-endian 64-
18da0 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d  bit.    ** twos-
18db0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
18dc0 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d  er. */.    pMem-
18dd0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
18de0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
18df0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
18e00 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
18e10 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73  >u.i<0 );.  }els
18e20 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
18e30 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34  CE-OF: R-57343-4
18e40 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20  9114 Value is a 
18e50 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20  big-endian IEEE 
18e60 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a  754-2008 64-bit.
18e70 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
18e80 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f  point number. */
18e90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
18ea0 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
18eb0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
18ec0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
18ed0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
18ee0 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
18ef0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
18f00 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
18f10 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64  .    ** byte ord
18f20 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
18f30 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
18f40 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
18f50 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e   is.    ** defin
18f60 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
18f70 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
18f80 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
18f90 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64  mixed.    ** end
18fa0 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ian..    */.    
18fb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
18fc0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
18fd0 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
18fe0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
18ff0 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
19000 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
19010 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19020 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
19030 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19040 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
19050 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
19060 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
19070 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
19080 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19090 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
190a0 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29  (pMem->u.r)==8 )
190b0 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
190c0 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
190d0 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
190e0 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  >u.r, &x, sizeof
190f0 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  (x));.    pMem->
19100 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
19110 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  sNaN(pMem->u.r) 
19120 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
19130 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  _Real;.  }.  ret
19140 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c  urn 8;.}.u32 sql
19150 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19160 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
19170 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
19180 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
19190 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
191a0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
191b0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
191c0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
191d0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
191e0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
19210 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19220 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19230 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
19240 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
19250 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
19260 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
19270 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
19280 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
19290 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
192a0 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
192b0 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
192c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
192d0 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
192e0 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
192f0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
19300 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
19310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19320 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
19330 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
19340 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
19350 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
19360 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
19370 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
19380 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19390 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
193a0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
193b0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
193c0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
193d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
193e0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
193f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19400 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
19410 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
19420 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19430 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19440 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
19450 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
19460 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
19470 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19480 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19490 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
194a0 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
194b0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
194c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
194d0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
194e0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
194f0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
19500 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
19510 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
19520 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
19530 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
19540 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
19550 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
19560 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
19570 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
19580 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
19590 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
195a0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
195b0 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
195c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
195d0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
195e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
195f0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19600 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
19610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
19620 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
19630 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19640 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19650 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
19660 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
19670 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
19680 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19690 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
196a0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
196b0 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
196c0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
196d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
196e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
196f0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19700 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19710 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
19720 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
19730 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19740 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19750 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
19760 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20  385-09674 Value 
19770 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19780 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  48-bit.      ** 
19790 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
197a0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
197b0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
197c0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
197d0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
197e0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
197f0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19800 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19810 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19820 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19830 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19840 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
19850 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
19860 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19870 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
19880 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
19890 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
198a0 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
198b0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
198c0 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
198d0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
198e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
198f0 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
19900 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
19910 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
19920 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
19930 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
19940 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
19950 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
19960 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
19970 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
19980 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
19990 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
199a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
199b0 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20  : R-12976-22893 
199c0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
199d0 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20  eger 0. */.     
199e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
199f0 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56   R-18143-12121 V
19a00 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
19a10 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 1. */.      
19a20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
19a30 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
19a40 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19a50 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
19a60 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
19a70 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
19a80 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19a90 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34  F: R-14606-31564
19aa0 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   Value is a BLOB
19ab0 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f   that is (N-12)/
19ac0 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20  2 bytes in.     
19ad0 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20   ** length..    
19ae0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
19af0 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20  : R-28401-00140 
19b00 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  Value is a strin
19b10 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e  g in the text en
19b20 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  coding and.     
19b30 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74   ** (N-13)/2 byt
19b40 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f  es in length. */
19b50 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
19b60 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
19b70 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
19b80 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
19b90 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
19ba0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
19bb0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
19bc0 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
19bd0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
19be0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19bf0 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
19c00 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
19c10 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
19c20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19c30 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
19c40 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
19c50 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
19c60 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
19c70 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
19c80 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
19c90 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
19ca0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
19cb0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
19cc0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
19cd0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19ce0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
19cf0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
19d00 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
19d10 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
19d20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
19d30 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
19d40 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
19d50 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
19d60 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
19d70 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
19d80 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
19d90 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
19da0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
19db0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
19dc0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
19dd0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
19de0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
19df0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
19e00 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
19e10 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
19e20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
19e30 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
19e40 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
19e50 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
19e60 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
19e70 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
19e80 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
19e90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
19ea0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
19eb0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
19ec0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19ed0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
19ee0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
19ef0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
19f00 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
19f10 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
19f20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
19f30 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
19f40 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
19f50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19f60 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
19f70 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
19f80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
19f90 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
19fa0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19fb0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
19fc0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
19fd0 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
19fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
19ff0 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
1a000 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
1a010 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
1a020 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
1a030 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
1a040 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
1a050 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
1a060 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1a070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a080 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
1a090 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
1a0a0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
1a0b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a0c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a0d0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1a0e0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
1a0f0 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
1a100 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
1a110 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
1a120 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
1a130 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
1a140 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
1a150 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
1a160 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
1a170 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
1a180 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
1a190 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
1a1a0 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
1a1b0 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
1a1c0 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
1a1d0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
1a1e0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
1a1f0 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
1a200 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
1a210 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1a220 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
1a230 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
1a240 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
1a250 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
1a260 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
1a270 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
1a280 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
1a290 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
1a2a0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
1a2b0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
1a2c0 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
1a2d0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1a2e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1a2f0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1a300 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
1a310 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
1a320 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
1a330 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
1a340 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
1a350 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1a360 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  rd))];.  assert(
1a370 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1a380 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d  Order!=0 );.  p-
1a390 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1a3a0 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c  Info;.  p->nFiel
1a3b0 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
1a3c0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1a3d0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1a3e0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1a3f0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1a400 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1a410 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1a420 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1a430 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1a440 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1a450 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1a460 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1a470 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1a480 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1a490 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1a4a0 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1a4b0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1a4c0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1a4d0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1a4e0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1a4f0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1a500 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a510 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1a520 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1a530 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1a540 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1a550 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1a560 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1a570 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1a580 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1a590 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1a5a0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1a5b0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1a5c0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1a5d0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1a5e0 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
1a5f0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1a600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a610 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1a620 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1a630 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1a660 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1a670 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1a680 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1a690 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1a6a0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1a6b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1a6c0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1a6d0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1a6e0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1a6f0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1a700 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1a710 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1a720 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
1a730 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1a740 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1a750 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1a760 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1a770 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1a780 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1a790 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1a7a0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1a7b0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1a7c0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1a7d0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1a7e0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1a7f0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1a800 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1a810 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1a820 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1a830 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1a840 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1a850 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1a860 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1a870 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1a880 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1a890 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
1a8a0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1a8b0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1a8c0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1a8d0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1a8e0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1a8f0 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1a900 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1a910 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1a920 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1a930 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1a940 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1a950 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1a960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1a970 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1a980 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1a990 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1a9a0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1a9b0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1a9c0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1a9d0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1a9e0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1a9f0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1aa00 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1aa10 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1aa20 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1aa30 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1aa40 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1aa50 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1aa60 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1aa70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1aa80 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1aa90 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1aaa0 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1aab0 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1aac0 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1aad0 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1aae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aaf0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1ab00 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1ab10 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1ab20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1ab30 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1ab40 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1ab50 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1ab60 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1ab70 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1ab80 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1ab90 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1aba0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1abb0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1abc0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1abd0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1abe0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1abf0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ac00 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1ac10 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1ac20 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1ac30 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1ac40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1ac50 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1ac60 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1ac70 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1ac80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1ac90 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1aca0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1acb0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1acc0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1acd0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1ace0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1acf0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1ad00 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1ad10 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1ad20 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1ad30 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1ad40 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1ad50 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1ad60 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1ad70 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1ad80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ad90 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1ada0 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1adb0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1adc0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1add0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1ade0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1adf0 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1ae00 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1ae10 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1ae20 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1ae30 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1ae40 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1ae50 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1ae60 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1ae70 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1ae80 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1ae90 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1aea0 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1aeb0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1aec0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1aed0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1aee0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1aef0 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1af00 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1af10 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1af20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1af30 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1af40 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1af50 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1af60 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1af70 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1af80 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1af90 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1afa0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1afb0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1afc0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1afd0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1afe0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1aff0 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1b000 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1b010 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1b020 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1b030 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1b040 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1b050 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1b060 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1b070 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1b080 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1b090 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b0a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b0b0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b0c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b0d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b0e0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1b0f0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1b100 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1b110 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1b120 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
1b130 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
1b140 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
1b150 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
1b160 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
1b170 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
1b180 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
1b190 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
1b1a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
1b1b0 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
1b1c0 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
1b1d0 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
1b1e0 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
1b1f0 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
1b200 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
1b210 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
1b220 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
1b230 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
1b240 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1b250 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
1b260 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
1b270 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
1b280 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
1b290 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
1b2a0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
1b2b0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
1b2c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b2d0 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
1b2e0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
1b2f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
1b300 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1b310 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
1b320 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
1b330 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1b340 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
1b350 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1b360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b370 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1b380 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1b390 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1b3a0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1b3b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b3c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1b3d0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1b3e0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1b3f0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1b400 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1b410 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1b420 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1b430 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
1b440 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1b450 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1b460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1b470 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1b480 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1b490 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1b4a0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1b4b0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1b4c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1b4d0 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1b4e0 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1b4f0 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1b500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1b510 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1b520 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1b530 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1b540 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1b550 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1b560 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1b570 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1b580 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1b590 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1b5a0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1b5b0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1b5c0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1b5d0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1b5e0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1b5f0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1b600 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1b610 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1b620 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1b630 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1b640 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1b650 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1b660 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1b670 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1b680 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1b690 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1b6a0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1b6b0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1b6c0 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1b6d0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1b6e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1b6f0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1b700 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1b710 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1b720 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1b730 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1b740 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1b750 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1b760 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1b770 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1b780 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1b790 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1b7a0 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1b7b0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1b7c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b7d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1b7e0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1b7f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1b800 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  UG./*.** Count t
1b810 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
1b820 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75  lds (a.k.a. colu
1b830 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f  mns) in the reco
1b840 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  rd given by.** p
1b850 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76  Key,nKey.  The v
1b860 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1b870 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68  count is less th
1b880 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1b890 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65  he.** limit give
1b8a0 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  n by pKeyInfo->n
1b8b0 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f  Field + pKeyInfo
1b8c0 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ->nXField..**.**
1b8d0 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1b8e0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1b8f0 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1b900 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1b910 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1b920 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1b930 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1b940 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1b950 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1b960 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1b970 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1b980 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1b990 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1b9a0 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1b9b0 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65  nfo.nField or Ke
1b9c0 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61  yInfo.nXField va
1b9d0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1b9e0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1b9f0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1ba00 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1ba10 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1ba20 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1ba30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1ba40 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1ba50 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1ba60 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1ba70 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1ba80 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1ba90 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1baa0 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1bab0 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1bac0 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1bad0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1bae0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1baf0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1bb00 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bb10 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1bb20 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1bb30 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1bb40 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1bb50 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1bb60 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1bb70 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1bb80 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1bb90 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1bba0 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1bbb0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1bbc0 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1bbd0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1bbe0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1bbf0 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  <= pKeyInfo->nFi
1bc00 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1bc10 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1bc20 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1bc30 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1bc40 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1bc50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1bc60 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1bc70 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1bc80 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1bc90 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1bca0 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1bcb0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1bcc0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1bcd0 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1bce0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1bcf0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1bd00 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1bd10 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1bd20 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1bd30 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1bd40 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1bd50 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1bd60 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1bd70 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1bd80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1bd90 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1bda0 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1bdb0 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1bdc0 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1bdd0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1bde0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1bdf0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1be00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1be10 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1be20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1be30 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1be40 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1be50 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1be60 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1be70 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1be80 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1be90 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1bea0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1beb0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1bec0 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1bed0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1bee0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1bef0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1bf00 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1bf10 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1bf20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1bf30 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20  1, *v2;.    int 
1bf40 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20  n1, n2;.    Mem 
1bf50 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1bf60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1bf70 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1bf80 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1bf90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bfa0 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1bfb0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1bfc0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1bfd0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1bfe0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1bff0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1c000 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1c010 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1c020 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1c030 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1c040 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1c050 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1c060 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1c070 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a  n1 = v1==0 ? 0 :
1c080 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20   c1.n;.    v2 = 
1c090 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1c0a0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1c0b0 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1c0c0 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d  );.    n2 = v2==
1c0d0 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20  0 ? 0 : c2.n;.  
1c0e0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1c0f0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1c100 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29   n1, v1, n2, v2)
1c110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c120 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1c130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c140 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1c150 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
1c160 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72   || v2==0) && pr
1c170 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1c180 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c1a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1c1b0 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52  re two blobs.  R
1c1c0 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1c1d0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1c1e0 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a  e if the first.*
1c1f0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  * is less than, 
1c200 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1c210 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1c220 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65  cond, respective
1c230 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c  ly..** If one bl
1c240 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ob is a prefix o
1c250 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65  f the other, the
1c260 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73  n the shorter is
1c270 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a   the lessor..*/.
1c280 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1c290 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1c2a0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1c2b0 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1c2c0 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1c2d0 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28   int c = memcmp(
1c2e0 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20  pB1->z, pB2->z, 
1c2f0 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20  pB1->n>pB2->n ? 
1c300 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29  pB2->n : pB1->n)
1c310 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75  ;.  if( c ) retu
1c320 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn c;.  return p
1c330 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a  B1->n - pB2->n;.
1c340 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
1c350 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
1c360 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
1c370 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
1c380 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
1c390 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
1c3a0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
1c3b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1c3c0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1c3d0 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
1c3e0 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
1c3f0 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
1c400 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
1c410 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
1c420 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
1c430 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
1c440 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
1c450 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
1c460 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
1c470 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
1c480 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
1c490 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
1c4a0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
1c4b0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1c4c0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
1c4d0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1c4e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1c4f0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
1c500 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
1c510 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
1c520 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1c530 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
1c540 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
1c550 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
1c560 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
1c570 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
1c580 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
1c590 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
1c5a0 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69    assert( (combi
1c5b0 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
1c5c0 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a  RowSet)==0 );. .
1c5d0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1c5e0 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
1c5f0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
1c600 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
1c610 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
1c620 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
1c630 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1c640 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
1c650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1c660 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
1c670 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
1c680 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
1c690 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72  alue is a number
1c6a0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
1c6b0 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65  s not, the numbe
1c6c0 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  r is less..  ** 
1c6d0 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62  If both are numb
1c6e0 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20  ers, compare as 
1c6f0 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20  reals if one is 
1c700 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e  a real, or as in
1c710 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62  tegers.  ** if b
1c720 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69  oth values are i
1c730 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ntegers..  */.  
1c740 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1c750 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1c760 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75  Real) ){.    dou
1c770 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
1c780 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1c790 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1c7a0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1c7b0 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1c7c0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1c7d0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1c7e0 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1c7f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1c800 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1c810 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1c820 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1c830 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75     r1 = pMem1->u
1c840 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .r;.    }else if
1c850 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
1c860 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
1c870 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75  (double)pMem1->u
1c880 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
1c890 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1c8a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1c8b0 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1c8c0 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d  .      r2 = pMem
1c8d0 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73  2->u.r;.    }els
1c8e0 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e  e if( (f2&MEM_In
1c8f0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  t)!=0 ){.      r
1c900 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d  2 = (double)pMem
1c910 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  2->u.i;.    }els
1c920 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1c930 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
1c940 28 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e  ( r1<r2 ) return
1c950 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e   -1;.    if( r1>
1c960 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  r2 ) return 1;. 
1c970 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c980 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1c990 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1c9a0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1c9b0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1c9c0 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1c9d0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1c9e0 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1c9f0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1ca00 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1ca10 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1ca20 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1ca30 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1ca40 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1ca50 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ca60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1ca70 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1ca80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ca90 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1caa0 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1cab0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b  c==pMem2->enc );
1cac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1cad0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1cae0 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1caf0 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1cb00 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1cb10 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1cb20 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1cb30 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1cb40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1cb50 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1cb60 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
1cb70 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
1cb80 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
1cb90 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1cba0 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
1cbb0 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
1cbc0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
1cbd0 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
1cbe0 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
1cbf0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1cc00 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
1cc10 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
1cc20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1cc30 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
1cc40 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1cc50 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
1cc60 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
1cc70 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
1cc80 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
1cc90 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
1cca0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
1ccb0 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
1ccc0 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
1ccd0 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
1cce0 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
1ccf0 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
1cd00 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
1cd10 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
1cd20 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
1cd30 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
1cd40 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
1cd50 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
1cd60 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1cd70 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1cd80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
1cd90 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
1cda0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
1cdb0 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
1cdc0 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
1cdd0 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
1cde0 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
1cdf0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
1ce00 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1ce10 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
1ce20 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
1ce30 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
1ce40 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
1ce50 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
1ce60 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
1ce70 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
1ce80 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
1ce90 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
1cea0 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
1ceb0 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
1cec0 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
1ced0 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
1cee0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
1cef0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
1cf00 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
1cf10 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
1cf20 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
1cf30 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1cf40 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
1cf50 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
1cf60 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1cf70 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1cf80 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
1cf90 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1cfa0 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
1cfb0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1cfc0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1cfd0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1cfe0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
1cff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d000 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
1d020 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1d030 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
1d040 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d050 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d060 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
1d070 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1d080 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1d090 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1d0a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1d0b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d0c0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d0d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d0e0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1d0f0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1d100 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1d110 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1d120 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
1d130 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
1d140 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1d150 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1d160 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d170 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
1d180 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1d190 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1d1a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1d1b0 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
1d1c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1d1d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1d1e0 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
1d1f0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1d200 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
1d210 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
1d220 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
1d230 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
1d240 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
1d250 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
1d260 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
1d270 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
1d280 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
1d290 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1d2a0 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
1d2b0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
1d2c0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
1d2d0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
1d2e0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
1d2f0 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1d300 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
1d310 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
1d320 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
1d330 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
1d340 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
1d350 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1d360 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
1d370 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
1d380 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
1d390 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
1d3a0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1d3b0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1d3c0 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
1d3d0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1d3e0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
1d3f0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
1d400 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
1d410 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
1d420 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1d430 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1d440 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
1d450 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
1d460 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
1d470 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
1d480 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1d490 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
1d4a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
1d4b0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1d4c0 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
1d4d0 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
1d4e0 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
1d4f0 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
1d500 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
1d510 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1d520 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
1d530 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
1d540 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1d550 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
1d560 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
1d570 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
1d580 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
1d590 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
1d5a0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1d5b0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1d5c0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1d5d0 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
1d5e0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1d5f0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1d600 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1d610 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d620 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
1d630 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1d640 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
1d670 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
1d680 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
1d690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1d6b0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1d6c0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1d6d0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d700 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
1d710 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1d720 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
1d750 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
1d760 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
1d770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d780 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1d790 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
1d7a0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1d7b0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7d0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1d7e0 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
1d7f0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
1d800 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
1d810 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
1d820 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
1d830 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1d840 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1d850 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1d860 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1d870 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1d880 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1d890 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
1d8a0 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
1d8b0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
1d8c0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
1d8d0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1d8e0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
1d8f0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1d900 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1d910 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
1d920 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
1d930 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
1d940 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
1d950 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
1d960 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
1d970 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
1d980 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
1d990 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
1d9a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d9b0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
1d9c0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
1d9d0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1d9e0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
1d9f0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
1da00 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
1da10 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
1da20 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
1da30 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1da40 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
1da50 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
1da60 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
1da70 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
1da80 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1da90 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1daa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1dab0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
1dac0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1dad0 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
1dae0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
1daf0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1db00 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1db10 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1db20 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
1db30 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1db40 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1db50 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1db60 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
1db70 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
1db80 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1db90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1dba0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
1dbb0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1dbc0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1dbd0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1dbe0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1dbf0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1dc00 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1dc10 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1dc20 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f  ial_type;..    /
1dc30 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65  * RHS is an inte
1dc40 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ger */.    if( p
1dc50 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1dc60 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65  _Int ){.      se
1dc70 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1dc80 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
1dc90 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1dca0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1dcb0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1dcc0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1dcd0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1dce0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1dcf0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1dd00 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1dd10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1dd20 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1dd30 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1dd40 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73  s = (double)pRhs
1dd50 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73  ->u.i;.        s
1dd60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1dd70 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1dd80 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1dd90 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1dda0 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b   mem1.u.r<rhs ){
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ddc0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1ddd0 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72  e if( mem1.u.r>r
1dde0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1ddf0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1de00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1de10 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1de20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1de30 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1de40 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1de50 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1de60 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1de70 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1de80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1de90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1dea0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1deb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1dec0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1ded0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dee0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1def0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1df00 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1df10 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1df20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1df30 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1df40 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1df50 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1df60 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1df70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1df80 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1df90 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1dfa0 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1dfb0 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1dfc0 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1dfd0 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1dfe0 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1dff0 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1e000 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1e010 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1e020 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1e030 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1e040 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1e050 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1e060 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1e070 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e080 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e090 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e0a0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1e0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f  else{.        do
1e0c0 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d  uble rhs = pRhs-
1e0d0 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f  >u.r;.        do
1e0e0 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20  uble lhs;.      
1e0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1e100 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1e110 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1e120 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1e130 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e140 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =7 ){.          
1e150 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a  lhs = mem1.u.r;.
1e160 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e170 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28           lhs = (
1e180 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b  double)mem1.u.i;
1e190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e1a0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1e1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e1c0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1e1d0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1e1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e1f0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1e200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e210 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1e220 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1e230 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e240 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1e250 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1e260 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1e270 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1e280 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1e290 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1e2a0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1e2b0 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1e2c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1e2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1e2e0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1e2f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1e300 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e310 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1e320 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1e330 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1e340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1e350 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1e360 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1e370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e380 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1e390 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1e3a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1e3b0 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1e3c0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1e3d0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1e3e0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1e3f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e400 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1e410 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e420 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1e430 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1e440 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
1e450 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
1e460 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
1e470 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1e480 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
1e490 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1e4a0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1e4b0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
1e4c0 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
1e4d0 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
1e4e0 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
1e4f0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
1e500 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1e510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
1e520 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1e530 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
1e540 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
1e550 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1e560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e570 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1e580 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1e590 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1e5a0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1e5b0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1e5c0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1e5d0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1e5e0 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1e5f0 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1e600 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e610 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1e620 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1e630 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1e640 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1e650 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1e660 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1e670 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1e680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1e690 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1e6a0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1e6b0 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
1e6c0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1e6d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1e6e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e6f0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
1e700 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1e710 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1e720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e730 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
1e740 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1e750 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e760 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
1e770 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1e780 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1e790 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
1e7a0 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1e7b0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1e7c0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1e7d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e7e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e7f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e800 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1e810 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1e820 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1e830 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1e840 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1e850 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1e860 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1e870 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1e880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1e890 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1e8a0 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1e8b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e8c0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e8d0 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1e8e0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1e8f0 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1e900 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1e910 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1e920 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1e930 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1e940 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1e950 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1e960 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1e970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1e980 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1e990 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1e9a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1e9b0 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1e9c0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1e9d0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1e9e0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1e9f0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ea00 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1ea10 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1ea20 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1ea30 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1ea40 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1ea50 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1ea60 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1ea70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1ea80 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1ea90 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1eaa0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1eab0 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1eac0 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1ead0 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1eae0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1eaf0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1eb00 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1eb10 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1eb20 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1eb30 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1eb40 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1eb50 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1eb60 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1eb70 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1eb80 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1eb90 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1eba0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1ebb0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1ebc0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1ebd0 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1ebe0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1ebf0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1ec00 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1ec10 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1ec20 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1ec30 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1ec40 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1ec50 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1ec60 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1ec70 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
1ec80 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1ec90 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1eca0 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
1ecb0 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
1ecc0 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1ecd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1ece0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  );.  return pPKe
1ecf0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1ed00 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1ed10 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
1ed20 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1ed30 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1ed40 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1ed50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1ed60 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1ed70 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1ed80 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
1ed90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1eda0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1edb0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1edc0 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
1edd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ede0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1edf0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1ee00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1ee10 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1ee20 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1ee30 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1ee40 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1ee50 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1ee60 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1ee70 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1ee80 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1ee90 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1eea0 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1eeb0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1eec0 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1eed0 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1eee0 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1eef0 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1ef00 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1ef10 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1ef20 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1ef30 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1ef40 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1ef50 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1ef60 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1ef70 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1ef80 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1ef90 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1efa0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1efb0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1efc0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1efd0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1efe0 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
1eff0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1f000 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
1f010 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
1f020 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
1f030 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
1f040 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
1f050 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
1f060 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70  4 x;.  i64 v = p
1f070 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
1f080 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a  .i;.  i64 lhs;..
1f090 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
1f0a0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1f0b0 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
1f0c0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1f0d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
1f0e0 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
1f0f0 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
1f100 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1f110 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1f120 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1f130 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f140 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f150 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1f160 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f170 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f190 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1f1a0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1f1b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f1c0 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1f1d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f1e0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1f1f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f210 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1f220 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1f230 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1f240 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1f250 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f260 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f280 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1f290 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1f2a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f2b0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1f2c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f2d0 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1f2e0 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1f2f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f310 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1f320 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1f330 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f340 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1f350 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1f360 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1f370 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1f380 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f390 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f3a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f3b0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1f3c0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1f3d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f3e0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1f3f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f400 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1f410 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f420 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1f430 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1f440 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f450 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f460 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f470 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1f480 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1f490 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1f4a0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1f4b0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1f4c0 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1f4d0 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1f4e0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1f4f0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1f500 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1f510 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1f520 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1f530 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1f540 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1f550 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1f560 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1f570 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1f580 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1f590 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1f5a0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1f5b0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1f5c0 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1f5d0 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1f5e0 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1f5f0 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1f600 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1f610 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1f620 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1f630 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1f640 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1f650 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1f660 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1f670 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1f680 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1f690 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f6a0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
1f6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1f6c0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f6d0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1f6e0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
1f6f0 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  }..  if( v>lhs )
1f700 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1f710 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
1f720 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
1f730 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1f740 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
1f750 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1f760 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
1f770 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1f780 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1f790 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
1f7a0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
1f7b0 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
1f7c0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1f7d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f7e0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1f7f0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f800 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1f810 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1f820 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1f830 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
1f840 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
1f850 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
1f860 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
1f870 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1f880 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
1f890 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
1f8a0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1f8b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f8c0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1f8d0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1f8e0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
1f8f0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
1f900 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
1f910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1f920 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1f930 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1f940 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1f950 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1f960 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1f970 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
1f980 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
1f990 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
1f9a0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1f9b0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
1f9c0 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
1f9d0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
1f9e0 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
1f9f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1fa00 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1fa10 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1fa20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fa30 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1fa40 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
1fa50 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1fa60 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1fa70 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1fa80 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1fa90 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
1faa0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
1fab0 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
1fac0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1fad0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
1fae0 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
1faf0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
1fb00 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1fb10 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
1fb20 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
1fb30 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
1fb40 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
1fb50 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
1fb60 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1fb70 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1fb80 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
1fb90 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
1fba0 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
1fbb0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
1fbc0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1fbd0 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
1fbe0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1fbf0 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
1fc00 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1fc10 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
1fc20 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
1fc30 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
1fc40 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
1fc50 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
1fc60 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1fc70 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
1fc80 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
1fc90 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
1fca0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1fcb0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1fcc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fcd0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
1fce0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1fcf0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
1fd00 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
1fd10 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
1fd20 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
1fd30 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
1fd40 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1fd50 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
1fd60 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1fd70 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
1fd80 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1fd90 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
1fda0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
1fdb0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1fdc0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
1fdd0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
1fde0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fdf0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1fe00 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
1fe10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1fe20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
1fe30 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1fe40 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t_rc;.        }.
1fe50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fe60 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
1fe70 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1fe80 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
1fe90 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1fea0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
1feb0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1fec0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
1fed0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1fee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fef0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1ff00 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
1ff10 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1ff20 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ff30 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1ff40 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
1ff50 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
1ff60 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
1ff70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
1ff80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1ff90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1ffa0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ffb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1ffc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1ffd0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
1ffe0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
1fff0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
20000 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
20010 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
20020 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
20030 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
20040 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
20050 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
20060 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
20070 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
20080 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
20090 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
200a0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
200b0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
200c0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
200d0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
200e0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
200f0 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
20100 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
20110 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
20120 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
20130 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
20140 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
20150 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
20160 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
20170 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
20180 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
20190 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
201a0 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
201b0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
201c0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
201d0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
201e0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
201f0 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
20200 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
20210 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
20220 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
20230 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
20240 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
20250 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
20260 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
20270 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
20280 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
20290 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
202a0 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
202b0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
202c0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
202d0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
202e0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
202f0 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
20300 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
20310 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
20320 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
20330 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
20340 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
20350 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
20360 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
20370 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
20380 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
20390 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
203a0 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
203b0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
203c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
203d0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
203e0 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
203f0 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
20400 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
20410 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
20420 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
20430 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
20440 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
20450 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
20460 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
20470 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
20480 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
20490 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
204a0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
204b0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
204c0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
204d0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
204e0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
204f0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
20500 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
20510 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
20520 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
20530 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
20540 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
20550 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
20560 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
20570 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
20580 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
20590 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
205a0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
205b0 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
205c0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
205d0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
205e0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
205f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
20600 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
20610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
20620 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
20630 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
20640 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
20650 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
20660 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
20670 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
20680 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
20690 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
206a0 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
206b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
206c0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
206d0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
206e0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
206f0 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
20700 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
20710 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
20720 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
20730 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
20740 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
20750 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
20760 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
20770 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
20780 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
20790 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
207a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
207b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
207c0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
207d0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
207e0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
207f0 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
20800 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
20810 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
20820 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
20830 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
20840 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
20850 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
20860 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
20870 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
20880 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
20890 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
208a0 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
208b0 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
208c0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
208d0 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
208e0 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
208f0 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
20900 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
20910 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
20920 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
20930 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
20940 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
20950 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
20960 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
20970 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
20980 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
20990 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
209a0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
209b0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
209c0 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
209d0 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
209e0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
209f0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
20a00 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20a10 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
20a20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
20a30 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
20a40 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
20a50 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
20a60 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
20a70 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
20a80 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
20a90 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
20aa0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
20ab0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
20ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
20ad0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
20ae0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
20af0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
20b00 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
20b10 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
20b20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20b30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
20b40 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
20b50 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
20b60 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
20b70 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
20b80 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
20b90 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
20ba0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
20bb0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
20bc0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
20bd0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
20be0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
20bf0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
20c00 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
20c10 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
20c20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
20c30 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
20c40 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
20c50 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
20c60 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
20c70 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
20c80 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
20c90 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
20ca0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
20cb0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
20cc0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
20cd0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
20ce0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
20cf0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
20d00 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
20d10 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
20d20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
20d30 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
20d40 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
20d50 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
20d60 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
20d70 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
20d80 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
20d90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
20da0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
20db0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
20dc0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
20dd0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
20de0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
20df0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
20e00 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
20e10 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
20e20 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
20e30 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20  es[typeRowid];. 
20e40 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
20e50 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
20e60 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
20e70 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
20e80 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
20e90 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
20ea0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
20eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
20ec0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
20ed0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20ee0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
20ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
20f00 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
20f10 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
20f20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
20f30 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
20f40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
20f50 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
20f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20f70 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
20f80 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
20f90 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
20fa0 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
20fb0 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
20fc0 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
20fd0 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
20fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20ff0 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
21000 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
21010 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61  testcase( m.szMa
21020 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
21030 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
21040 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
21050 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21060 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
21070 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
21080 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
21090 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
210a0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
210b0 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
210c0 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
210d0 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
210e0 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
210f0 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
21100 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
21110 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
21120 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
21130 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
21140 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
21150 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
21160 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
21170 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
21180 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
21190 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
211a0 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
211b0 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
211c0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
211d0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
211e0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
211f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
21200 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
21210 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
21220 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
21230 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
21240 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
21250 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
21260 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
21270 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
21280 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
21290 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
212a0 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
212b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
212e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
212f0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21310 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
21320 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
21330 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
21340 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
21350 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
21360 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
21370 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
213a0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
213b0 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
213c0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
213d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
213e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
213f0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
21400 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
21410 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
21420 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
21430 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
21440 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
21450 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
21460 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
21470 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
21480 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43  E_OK );    /* pC
21490 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
214a0 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
214b0 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f  nnot fail */.  /
214c0 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
214d0 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
214e0 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
214f0 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
21500 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e way.  ** that 
21510 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
21520 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
21530 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
21540 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
21550 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
21560 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
21570 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
21580 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
21590 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
215a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
215b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
215c0 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
215d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
215e0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
215f0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  ->pCursor, 0, (u
21600 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
21610 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21620 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21630 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
21640 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21650 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
21660 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
21670 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
21680 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
21690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
216a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
216b0 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
216c0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
216d0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
216e0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
216f0 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
21700 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
21710 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
21720 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
21730 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
21740 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
21750 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
21760 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21770 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
21780 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
21790 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
217a0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
217b0 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
217c0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
217d0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
217e0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
217f0 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
21800 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
21810 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
21820 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
21830 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
21840 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
21850 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
21860 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
21870 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
21880 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
21890 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
218a0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
218b0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
218c0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
218d0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
218e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
218f0 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
21900 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
21910 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
21920 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
21930 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
21940 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
21950 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
21960 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
21970 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
21980 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
21990 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
219a0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
219b0 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
219c0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
219d0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
219e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
219f0 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
21a00 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
21a10 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
21a20 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
21a30 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
21a40 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
21a50 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
21a60 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
21a70 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
21a80 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
21a90 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
21aa0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
21ab0 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
21ac0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
21ad0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
21ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21af0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
21b00 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
21b10 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
21b20 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
21b30 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
21b40 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
21b50 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
21b60 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
21b70 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
21b80 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
21b90 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
21ba0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
21bb0 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
21bc0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
21bd0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
21be0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
21bf0 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
21c00 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
21c10 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
21c20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
21c30 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
21c40 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
21c50 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
21c60 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
21c70 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
21c80 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
21c90 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
21ca0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
21cb0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
21cc0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
21cd0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
21ce0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
21cf0 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
21d00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
21d10 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
21d20 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
21d30 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
21d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21d50 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
21d60 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
21d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
21d80 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
21d90 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
21da0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
21db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
21dc0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
21dd0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21de0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
21df0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
21e00 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
21e10 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
21e20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
21e30 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
21e40 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
21e50 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
21e60 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
21e70 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
21e80 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
21e90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
21ea0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
21eb0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
21ec0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
21ed0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
21ee0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
21ef0 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
21f00 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
21f10 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
21f20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
21f30 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
21f40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
21f50 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  TABLE./*.** Tran
21f60 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
21f70 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
21f80 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
21f90 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
21fa0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
21fb0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
21fc0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
21fd0 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
21fe0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
21ff0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
22000 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22010 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f  DbMalloc)..*/.vo
22020 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  id sqlite3VtabIm
22030 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20  portErrmsg(Vdbe 
22040 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
22050 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
22060 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
22070 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22080 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
22090 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
220a0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
220b0 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
220c0 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg);.  sqlite3_
220d0 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
220e0 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
220f0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65  ErrMsg = 0;.}.#e
22100 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22110 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
22120 20 2a 2f 0a                                       */.