/ Hex Artifact Content
Login

Artifact e189aaf40871062c8451bbc28ce7a275b77979d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e    return p ? p->
0740: 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zSql : 0;.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
08e0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08f0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0900: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0910: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0920: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0930: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0940: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0950: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0960: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
0970: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
0980: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
0990: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09b0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09c0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09e0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a00: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a10: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a20: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a30: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a50: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a60: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0ac0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0ad0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0ae0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0af0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b00: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b10: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b20: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b40: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b50: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b60: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0b70: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0b80: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0b90: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0ba0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0bb0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bc0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0bd0: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0be0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0bf0: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c00: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c10: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c20: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c30: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c40: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c50: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c60: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0c70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c80: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0c90: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0ca0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0cb0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cc0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0cd0: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0ce0: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d10: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d20: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d40: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d50: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d60: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0d70: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d80: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0d90: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0da0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0db0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0dc0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0dd0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0de0: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0df0: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e00: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e20: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e30: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e50: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0e70: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0e80: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0e90: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0eb0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0ed0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0ee0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0ef0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f00: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f10: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f20: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f30: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f40: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f50: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f60: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0f70: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0f80: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0f90: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fa0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fb0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0fc0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
0fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0fe0: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
0ff0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1000: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1010: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1020: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1030: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1040: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1050: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1060: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1070: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1080: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1090: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10c0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
10d0: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
10e0: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
10f0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1100: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1110: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1120: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1130: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1150: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1160: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1170: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1180: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1190: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
11a0: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
11b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
11c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
11d0: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
11e0: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
11f0: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b  Alloc<=p->nOp );
1200: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72  .  if( growOpArr
1210: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72  ay(p, 1) ) retur
1220: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
1230: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1240: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
1250: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1260: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1270: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1280: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1290: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
12a0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
12b0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
12c0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
12d0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
12e0: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
12f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1300: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1310: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
1320: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
1330: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1340: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74  oc<=i ){.    ret
1350: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f  urn growOp3(p, o
1360: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1370: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
1380: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
1390: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
13a0: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
13b0: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
13c0: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
13d0: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
13e0: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
13f0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
1400: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
1410: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
1420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
1430: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
1440: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1470: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
1480: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1490: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14a0: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
14b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
14c0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
14d0: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
14e0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14f0: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1500: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1510: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
1520: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
1530: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
1540: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1550: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
1560: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1570: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1580: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1590: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
15a0: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
15b0: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
15c0: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
15d0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
15e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
15f0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1600: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
1610: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
1620: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1630: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1640: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1650: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1660: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1670: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1680: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1690: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
16a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
16b0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
16c0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
16d0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
16e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
16f0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1700: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1710: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1720: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1730: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1750: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1760: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
17a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17b0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17c0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
17d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17e0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
17f0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
1800: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
1810: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1820: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1830: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1840: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1850: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1860: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1870: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1880: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1890: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
18a0: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
18b0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
18c0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
18d0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
18e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
18f0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1900: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
1910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1920: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1930: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1940: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1950: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1960: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1970: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1980: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1990: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
19a0: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
19b0: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
19c0: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
19d0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
19e0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
19f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1a00: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1a10: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1a20: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1a30: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1a40: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1a50: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1a60: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1a70: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1a80: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1a90: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1aa0: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1ab0: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1ac0: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ad0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1ae0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1af0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1b10: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62  dbeMultiLoad(Vdb
1b20: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b40: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  pes, ...){.  va_
1b50: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69  list ap;.  int i
1b60: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61  ;.  char c;.  va
1b70: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65  _start(ap, zType
1b80: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  s);.  for(i=0; (
1b90: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d  c = zTypes[i])!=
1ba0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
1bb0: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20   c=='s' ){.     
1bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1bd0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1be0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1bf0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1c00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20  e3VdbeAddOp2(p, 
1c10: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a  z==0 ? OP_Null :
1c20: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1c30: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 20 20  iDest++);.      
1c40: 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 33 56  if( z ) sqlite3V
1c50: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1c60: 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  ddr, z, 0);.    
1c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c80: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ca0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cb0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cc0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1ce0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1cf0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d00: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d10: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d20: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d40: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d60: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d70: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d80: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d90: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1da0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dc0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1dd0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1df0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e00: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e10: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e30: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e40: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e50: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e60: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e70: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e80: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1e90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1ea0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ec0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ed0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ee0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f00: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f10: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f20: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f30: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f40: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f50: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f60: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f80: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1f90: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fc0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fe0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1ff0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2000: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2010: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2020: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2030: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2040: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2050: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2060: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2070: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2080: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2090: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20c0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20d0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20e0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
20f0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2110: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2120: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2130: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2140: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2150: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2160: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2170: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2180: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2190: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21a0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21b0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21c0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21d0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
21f0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2200: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2210: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2220: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2240: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2250: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2260: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2280: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
2290: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22a0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22b0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
22c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
22d0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
22e0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
22f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2310: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
2320: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
2330: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
2340: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
2350: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
2360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
2370: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2380: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2390: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
23a0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
23d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
23e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
23f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
2420: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2440: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2450: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2460: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2470: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2490: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
24a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
24d0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
24e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
24f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
2500: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
2510: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2520: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
2530: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2540: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
2550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2570: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2580: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2590: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
25a0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
25b0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
25c0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
25d0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
25e0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
25f0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2600: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2610: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2620: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2630: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2640: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2650: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2660: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2670: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2680: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2690: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
26a0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
26b0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
26c0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
26d0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
26e0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
26f0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2700: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2710: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2720: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2730: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2740: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2750: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2760: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2770: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2780: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2790: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
27a0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
27b0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
27c0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
27d0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
27f0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
2800: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2810: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2820: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
2830: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2840: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2850: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
2860: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
2870: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
2880: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2890: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
28a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
28e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
28f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
2900: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
2910: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
2920: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
2930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2940: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2950: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2960: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2970: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2980: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2990: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
29a0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
29b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
29c0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
29d0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
29f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2a00: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2a10: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2a20: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2a30: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2a40: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2a50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2a70: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2a80: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2a90: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2aa0: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2ab0: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
2ac0: 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d  .  p->iFixedOp =
2ad0: 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a   v->nOp - 1;.}..
2ae0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
2af0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2b00: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2b10: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
2b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
2b30: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
2b40: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
2b50: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
2b60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
2b70: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
2b80: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
2b90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
2ba0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
2bb0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
2bc0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2bd0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
2be0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
2bf0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
2c00: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
2c10: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
2c20: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
2c30: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
2c40: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
2c50: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
2c60: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2c70: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
2c80: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
2c90: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
2ca0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2cb0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
2cc0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
2cf0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
2d00: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
2d10: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
2d20: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
2d30: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
2d40: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
2d50: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
2d60: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2d70: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
2d80: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2d90: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
2da0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
2db0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
2dc0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
2dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
2de0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
2df0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
2e00: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
2e10: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2e20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2e30: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2e40: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e60: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2e70: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2e80: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2ea0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2eb0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
2ec0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
2ef0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
2f00: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
2f10: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2f20: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2f30: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2f40: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2f50: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2f60: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2f70: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2f80: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2f90: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2fa0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2fb0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
2fc0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
2fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fe0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
2ff0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
3000: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
3010: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
3020: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
3030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
3040: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
3050: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
3060: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
3070: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
3080: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
3090: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
30a0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
30b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
30c0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
30d0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
30e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
30f0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
3100: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
3110: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
3120: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
3130: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
3140: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
3150: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
3160: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
3170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3180: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
3190: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
31a0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
31b0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
31c0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
31d0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
31e0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
31f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
3200: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
3210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3220: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
3230: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
3240: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
3250: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3260: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3270: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
3280: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
3290: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
32a0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
32b0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
32c0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
32d0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
32e0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
32f0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
3300: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
3310: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
3320: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
3330: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
3340: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
3350: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
3360: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
3370: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
3380: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
3390: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
33a0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
33b0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
33c0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
33d0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
33e0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
33f0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3400: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3410: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
3420: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
3430: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
3440: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
3450: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
3460: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
3470: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
3480: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
3490: 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f  ateTable and OP_
34a0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66  InitCoroutine (f
34b0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
34c0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
34d0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
34e0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
34f0: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3500: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3510: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3520: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3530: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3540: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3550: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3560: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3580: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3590: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
35a0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
35b0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
35c0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
35d0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
35e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
35f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3600: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3610: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3620: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3630: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3640: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3650: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3660: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3670: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3680: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3690: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
36a0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
36b0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
36c0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
36d0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
36e0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
36f0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3700: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3710: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3720: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3730: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3740: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3750: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3770: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3780: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3790: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
37a0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
37b0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
37c0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
37d0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
37e0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
37f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3800: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3810: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3820: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3830: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3840: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3850: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
3860: 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74 65  able ) hasCreate
3870: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
3880: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
3890: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
38a0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38b0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
38c0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
38d0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
38e0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
38f0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
3900: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
3910: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
3920: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
3930: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
3940: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
3950: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
3960: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
3970: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
3980: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
3990: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
39a0: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
39b0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
39c0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
39d0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
39e0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
39f0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
3a00: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
3a10: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
3a20: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
3a30: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
3a40: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
3a50: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
3a60: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
3a70: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
3a80: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
3a90: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
3aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3ab0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
3ac0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
3ad0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
3ae0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
3af0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
3b00: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
3b10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3b20: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
3b30: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
3b40: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
3b50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
3b60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3b70: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
3b80: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
3b90: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
3ba0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
3bb0: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
3bc0: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
3bd0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
3be0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
3bf0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
3c00: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
3c10: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
3c20: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
3c30: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
3c40: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
3c50: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
3c60: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
3c70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3c80: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
3c90: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
3ca0: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
3cb0: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
3cc0: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
3cd0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
3ce0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
3cf0: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
3d00: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
3d10: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
3d20: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
3d30: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
3d40: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
3d50: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
3d60: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
3d70: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
3d80: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
3d90: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
3da0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
3db0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
3dc0: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f  oring labels..*/
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3de0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3df0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3e00: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3e10: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3e20: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3e30: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3e50: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3e60: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
3e70: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
3e80: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
3e90: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
3ea0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
3eb0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
3ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3ed0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3ee0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3ef0: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3f00: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3f10: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3f20: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3f30: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3f40: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3f50: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3f60: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
3f70: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
3f80: 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  saction: {.     
3f90: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
3fa0: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
3fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
3fc0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
3fd0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3fe0: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
3ff0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76       case OP_Sav
4000: 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20  epoint: {.      
4010: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4020: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
4030: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
4040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
4050: 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  AL.      case OP
4060: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
4070: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
4080: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
4090: 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
40a0: 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ode: {.        p
40b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
40c0: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
40d0: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
40e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4110: 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  E.      case OP_
4120: 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  VUpdate: {.     
4130: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4140: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4150: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
4160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4170: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4180: 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20  OP_VFilter: {.  
4190: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
41a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
41b0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
41c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
41d0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
41e0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
41f0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
4200: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ].p1;.        if
4210: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
4220: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20  MaxArgs = n;.   
4230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4240: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
4250: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20   case OP_Next:. 
4260: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4270: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63  tIfOpen:.      c
4280: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
4290: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t: {.        pOp
42a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
42b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
42c0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
42d0: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
42e0: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
42f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4300: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20   case OP_Prev:. 
4310: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
4320: 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  vIfOpen: {.     
4330: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4340: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4350: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4360: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4370: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
4380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4390: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
43a0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73  pOp->opflags = s
43b0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
43c0: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20  erty[opcode];.  
43d0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
43e0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
43f0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
4400: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4410: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50  t( -1-pOp->p2<pP
4420: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  arse->nLabel );.
4430: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4440: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
4450: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
4460: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4470: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
4480: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
4490: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
44a0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
44b0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
44c0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
44d0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
44e0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
44f0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
4500: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
4510: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
4520: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4530: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4540: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
4550: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4560: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
4570: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4580: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4590: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
45a0: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
45b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
45c0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
45d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
45e0: 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61  ray of opcodes a
45f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
4600: 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  * the Vdbe passe
4610: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4620: 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74  rgument. It is t
4630: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
4640: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
4650: 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
4660: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74  returned array t
4670: 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  o be eventually 
4680: 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20  freed using the 
4690: 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72  .** vdbeFreeOpAr
46a0: 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ray() function..
46b0: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
46c0: 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73  urning, *pnOp is
46d0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
46e0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
46f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
4700: 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70   array. Also, *p
4710: 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74  nMaxArg is set t
4720: 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  o the larger of 
4730: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
4740: 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75  e and .** the nu
4750: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4760: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  in the Vdbe.apAr
4770: 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72  g[] array requir
4780: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
4790: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70  e .** returned p
47a0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f  rogram..*/.VdbeO
47b0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
47c0: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
47d0: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
47e0: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
47f0: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
4800: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
4810: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
4820: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
4830: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
4840: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4850: 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63  tree() was not c
4860: 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d  alled on this VM
4870: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62   */.  assert( Db
4880: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4890: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20  treeMask) );..  
48a0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
48b0: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
48c0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
48d0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
48e0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
48f0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
4900: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
4910: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
4920: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
4930: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
4940: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
4950: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
4960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4970: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
4980: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
4990: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
49a0: 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e  *aOp, int iLinen
49b0: 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  o){.  int addr, 
49c0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
49d0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
49e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
49f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4a00: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4a10: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4a20: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4a30: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4a40: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4a50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4a60: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4a70: 70 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  p;.  pOut = &p->
4a80: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72  aOp[addr];.  for
4a90: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
4aa0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
4ab0: 7b 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 61  {.    int p2 = a
4ac0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 70 4f 75 74  Op->p2;.    pOut
4ad0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e  ->opcode = aOp->
4ae0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74  opcode;.    pOut
4af0: 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a  ->p1 = aOp->p1;.
4b00: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a      if( p2<0 ){.
4b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4b20: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4b30: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4b40: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4b50: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
4b60: 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   = addr + ADDR(p
4b70: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
4b80: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4b90: 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  p2;.    }.    pO
4ba0: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
4bb0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
4bc0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4bd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
4be0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
4bf0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4c00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4c10: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4c20: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
4c30: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
4c40: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
4c50: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
4c60: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
4c70: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
4c80: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4c90: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4cb0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
4cc0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
4cd0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
4ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4cf0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4d00: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4d10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4d20: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4d30: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  Op;.  return add
4d40: 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  r;.}..#if define
4d50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4d60: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
4d70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
4d80: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
4d90: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
4da0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
4db0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
4dc0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
4dd0: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
4de0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
4e10: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
4e20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
4e30: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
4e40: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4e50: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
4e60: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
4e70: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
4e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4e90: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
4ea0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
4eb0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4ed0: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
4ee0: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
4ef0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
4f20: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
4f30: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
4f40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4f60: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
4f70: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
4f80: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
4f90: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
4fa0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
4fb0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
4fc0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
4fd0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
4fe0: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
4ff0: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
5000: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
5010: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
5020: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
5030: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
5040: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
5050: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
5060: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
5070: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
5080: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
5090: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
50a0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
50b0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
50c0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
50d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
50e0: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
50f0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
5100: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
5110: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
5120: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5130: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
5140: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
5150: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
5160: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5170: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5180: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5190: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
51a0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38  *p, u32 addr, u8
51b0: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
51c0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
51d0: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
51e0: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
51f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5200: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
5210: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5220: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5230: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5240: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
5250: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5260: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
5270: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5280: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5290: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
52a0: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
52b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52c0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
52d0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
52e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
52f0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5300: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
5310: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5320: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
5330: 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  p5){.  sqlite3Vd
5340: 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e 70  beGetOp(p,-1)->p
5350: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
5360: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
5370: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
5380: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
5390: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
53a0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
53b0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
53c0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
53d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
53e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
53f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5400: 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  r){.  p->pParse-
5410: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
5420: 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  Op - 1;.  sqlite
5430: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5440: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5450: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5460: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5470: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5480: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5490: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
54a0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
54b0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
54c0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
54d0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
54e0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
54f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5500: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5510: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
5520: 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  & (pDef->funcFla
5530: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5540: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5560: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
5570: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
5580: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5590: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
55a0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
55b0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
55c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
55d0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
55e0: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
55f0: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
5600: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
5610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
5620: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
5630: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
5640: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
5650: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5660: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5670: 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f 63  (db, ((sqlite3_c
5680: 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 75  ontext*)p4)->pFu
5690: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nc);.        /* 
56a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
56b0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
56c0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
56d0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
56e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
56f0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
5700: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
5710: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
5720: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
5730: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5740: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5750: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5760: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
5770: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5780: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5790: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
57a0: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
57b0: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
57c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
57e0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
57f0: 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  S.      case P4_
5800: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EXPR: {.        
5810: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5820: 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29  e(db, (Expr*)p4)
5830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5840: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
5850: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
5860: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
5870: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
5880: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
5890: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
58a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
58c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
58d0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
58e0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
58f0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
5900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5920: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
5930: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5940: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
5950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
5960: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
5970: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
5980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5990: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
59a0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
59b0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
59c0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
59d0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
59e0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  c);.          sq
59f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a00: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
5a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5a30: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
5a40: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5a50: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5a60: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
5a70: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
5a80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
5ab0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
5ac0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
5ad0: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
5ae0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
5af0: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
5b00: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
5b10: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
5b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
5b30: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
5b40: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
5b50: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5b60: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5b70: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
5b80: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
5b90: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
5ba0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
5bb0: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
5bc0: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
5bd0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5be0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5bf0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
5c00: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5c10: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
5c20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5c30: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
5c40: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
5c50: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5c60: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
5c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
5c80: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
5c90: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
5ca0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5cb0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
5cc0: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
5cd0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
5ce0: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
5cf0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
5d00: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
5d10: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
5d20: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
5d30: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
5d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
5d50: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
5d60: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
5d70: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
5d80: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
5d90: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
5da0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
5db0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5dc0: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
5dd0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
5de0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5df0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
5e00: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5e10: 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d  ){.  if( addr<p-
5e20: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >nOp ){.    Vdbe
5e30: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5e40: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
5e50: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5e60: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
5e70: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5e80: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
5e90: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
5ea0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
5eb0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
5ec0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a  OP_Noop;.  }.}..
5ed0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
5ee0: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
5ef0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
5f00: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
5f10: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
5f20: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
5f30: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
5f40: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
5f50: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
5f60: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5f70: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
5f80: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
5f90: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
5fa0: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
5fb0: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
5fc0: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
5fd0: 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =op ){.    sqlit
5fe0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
5ff0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
6000: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
6010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6020: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
6030: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
6040: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
6050: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
6060: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
6070: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
6080: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
6090: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
60a0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
60b0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
60c0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
60d0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
60e0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
60f0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
6100: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
6110: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
6120: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
6130: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
6140: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
6150: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
6160: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
6170: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
6180: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
6190: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
61a0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
61b0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
61c0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
61d0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
61e0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
61f0: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
6200: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
6210: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
6220: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
6230: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
6240: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
6250: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
6260: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
6270: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
6280: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
6290: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
62a0: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
62b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
62c0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
62d0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
62e0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
62f0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
6300: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
6310: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6320: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
6330: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6340: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6350: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
6360: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
6370: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
6380: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
6390: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
63a0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
63b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
63c0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
63d0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
63e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
63f0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
6400: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
6410: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n!=P4_VTAB ){. 
6420: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
6430: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
6440: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
6450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6470: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6480: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
6490: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
64a0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
64b0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
64c0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
64d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
64e0: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
64f0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  ED.       || pOp
6500: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
6510: 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  32.       || pOp
6520: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
6530: 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34  INFO );.  freeP4
6540: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
6550: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
6560: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
6570: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
6580: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
6590: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
65a0: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
65b0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
65c0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
65d0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
65e0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
65f0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
6600: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
6610: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
6620: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6630: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
6640: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
6650: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
6660: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
6670: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6680: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
6690: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
66a0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
66b0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
66c0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
66d0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66 64  P4_KEYINFO;.#ifd
66e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
66f0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
6700: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6710: 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20 52  EXPR ){.    /* R
6720: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f  esponsibility fo
6730: 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 45  r deleting the E
6740: 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e 64  xpr tree is hand
6750: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 20  ed over to the. 
6760: 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74 68     ** VDBE by th
6770: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54  is operation.  T
6780: 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
6790: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69 6e   have already in
67a0: 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71 6c  voked.    ** sql
67b0: 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f 72  ite3ExprDup() or
67c0: 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72 20   whatever other 
67d0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64 65  routine is neede
67e0: 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20 20  d to make a .   
67f0: 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70 79   ** private copy
6800: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f   of the tree. */
6810: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45 78  .    pOp->p4.pEx
6820: 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34 3b  pr = (Expr*)zP4;
6830: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6840: 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e 64   = P4_EXPR;.#end
6850: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  if.  }else if( n
6860: 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20  ==P4_VTAB ){.   
6870: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
6880: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
6890: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54  ->p4type = P4_VT
68a0: 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AB;.    sqlite3V
68b0: 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20  tabLock((VTable 
68c0: 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65  *)zP4);.    asse
68d0: 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a  rt( ((VTable *)z
68e0: 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29  P4)->db==p->db )
68f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
6900: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
6910: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
6920: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6930: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
6940: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
6950: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
6960: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6970: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6980: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
6990: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
69a0: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
69b0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
69c0: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  IC;.  }.}../*.**
69d0: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74   Set the P4 on t
69e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
69f0: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f   added opcode to
6a00: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72   the KeyInfo for
6a10: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69   the.** index gi
6a20: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
6a30: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6a40: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
6a50: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
6a60: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6a70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
6a80: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
6a90: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
6aa0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6ab0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6ac0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
6ad0: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
6ae0: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20  arse, pIdx),.   
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
6b10: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
6b20: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6b30: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
6b40: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
6b50: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
6b60: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
6b70: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
6b80: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
6b90: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
6ba0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
6bb0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
6bc0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
6bd0: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
6be0: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
6bf0: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
6c00: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
6c10: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
6c20: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
6c30: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
6c40: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
6c50: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6c60: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
6c70: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
6c80: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
6c90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6ca0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
6cb0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
6cc0: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
6cd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6ce0: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
6cf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6d00: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
6d10: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
6d20: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d30: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
6d40: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d50: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
6d60: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
6d70: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6d80: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
6d90: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
6da0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
6db0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
6dc0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
6de0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6df0: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6e00: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6e10: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6e20: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
6e30: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
6e40: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
6e60: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6e70: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6e80: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6e90: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
6ea0: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
6eb0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6ec0: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
6ed0: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
6ee0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
6ef0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
6f00: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
6f10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
6f20: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
6f30: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
6f40: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
6f50: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
6f60: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
6f70: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6f80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6f90: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
6fa0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
6fb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6fc0: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
6fd0: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
6fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6ff0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
7000: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
7010: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
7020: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
7030: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
7040: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
7050: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
7060: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
7070: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
7080: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
7090: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
70a0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
70b0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
70c0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
70d0: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
70e0: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
70f0: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
7100: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
7110: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
7120: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
7130: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
7140: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
7150: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
7160: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
7170: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
7180: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
7190: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
71a0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f  ng.** after an O
71b0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
71c0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
71d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
71e0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
71f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7200: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
7210: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
7220: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
7230: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
7240: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
7250: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
7260: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
7270: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
7280: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
7290: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
72a0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
72b0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
72c0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
72d0: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
72e0: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
72f0: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
7300: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
7310: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
7320: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
7330: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
7340: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
7350: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
7360: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
7370: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
7380: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
7390: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
73a0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
73b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
73c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
73d0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
73e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
73f0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
7400: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
7410: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
7420: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7430: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7440: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7450: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
7460: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
7470: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7480: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
7490: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
74a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
74b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
74c0: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
74d0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
74e0: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
74f0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
7500: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
7510: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
7520: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
7530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
7540: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
7550: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
7560: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
7570: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
7580: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
7590: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
75a0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
75b0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
75c0: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
75d0: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
75e0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
75f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
7600: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
7610: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
7620: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
7630: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
7640: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
7650: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
7660: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
7670: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
7680: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
7690: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
76a0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
76b0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
76c0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
76d0: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
76e0: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
76f0: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
7700: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
7710: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
7720: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
7730: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
7740: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
7750: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
7760: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
7770: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
7780: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
7790: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
77a0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
77b0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
77c0: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
77d0: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
77e0: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
77f0: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
7800: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7810: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
7820: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
7830: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
7840: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
7850: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
7860: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
7870: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
7880: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
7890: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
78a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
78b0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
78c0: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
78d0: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
78e0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
78f0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
7900: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
7910: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
7920: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7930: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
7940: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
7950: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
7960: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
7970: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
7980: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
7990: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
79a0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
79b0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
79c0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
79d0: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
79e0: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
79f0: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
7a00: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
7a10: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
7a20: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
7a30: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
7a40: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
7a50: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
7a60: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
7a70: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
7a80: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
7a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7aa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7ab0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7ac0: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
7ad0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7ae0: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
7af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7b00: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7b10: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
7b20: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
7b30: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
7b40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
7b50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
7b60: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
7b70: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
7b80: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
7b90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7ba0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7bb0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
7bc0: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
7bd0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
7be0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
7bf0: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
7c00: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
7c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
7c20: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
7c30: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
7c40: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
7c50: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
7c60: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7c80: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7c90: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
7ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7cb0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
7cc0: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7ce0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
7cf0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d10: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7d20: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
7d30: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
7d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7d60: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7d70: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
7d80: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
7d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7da0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
7db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7dc0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7dd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7de0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
7df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
7e00: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
7e10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7e20: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
7e30: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
7e40: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7e60: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7e70: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
7e80: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7e90: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
7ea0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7eb0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
7ec0: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
7ed0: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
7ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
7ef0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
7f00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f10: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f20: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
7f30: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
7f40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7f50: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
7f60: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
7f70: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
7f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7fa0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
7fb0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
7fc0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
7fd0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7fe0: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
7ff0: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
8000: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
8010: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
8020: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
8030: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
8040: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
8050: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
8060: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
8070: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
8080: 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e 54  layP4Expr(int nT
8090: 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  emp, char *zTemp
80a0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
80b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
80c0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a  p = 0;.  int n;.
80d0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
80e0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
80f0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8100: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8110: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8120: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
8130: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
8140: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8150: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
8160: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8170: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8180: 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
8190: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
81a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
81b0: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69  NULL:.      sqli
81c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
81d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
81e0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
81f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
8200: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
8210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8220: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72  nTemp, zTemp, "r
8230: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
8240: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
8250: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8260: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
8270: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8280: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
8290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
82a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
82b0: 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  emp, "rowid");. 
82c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
82d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
82f0: 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70  p, "c%d", (int)p
8300: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
8310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8320: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8330: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
8340: 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  zOp = "LT";     
8350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8360: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70   TK_LE:      zOp
8370: 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72   = "LE";      br
8380: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8390: 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GT:      zOp = 
83a0: 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GT";      break
83b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
83c0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45  :      zOp = "GE
83d0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
83e0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
83f0: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20      zOp = "NE"; 
8400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8410: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
8420: 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20   zOp = "EQ";    
8430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8440: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f  e TK_IS:      zO
8450: 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62  p = "IS";      b
8460: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8470: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d  K_ISNOT:   zOp =
8480: 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61   "ISNOT";   brea
8490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
84a0: 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41  ND:     zOp = "A
84b0: 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ND";     break;.
84c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
84d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
84e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84f0: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
8500: 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20    zOp = "ADD";  
8510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8520: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
8530: 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20  Op = "MUL";     
8540: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8550: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20  TK_MINUS:   zOp 
8560: 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65  = "SUB";     bre
8570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8580: 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  REM:     zOp = "
8590: 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  REM";     break;
85a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
85b0: 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  AND:  zOp = "BIT
85c0: 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  AND";  break;.  
85d0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
85e0: 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22     zOp = "BITOR"
85f0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8600: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
8610: 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  zOp = "DIV";    
8620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8630: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70   TK_LSHIFT:  zOp
8640: 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72   = "LSHIFT";  br
8650: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8660: 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _RSHIFT:  zOp = 
8670: 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "RSHIFT";  break
8680: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
8690: 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f  NCAT:  zOp = "CO
86a0: 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NCAT";  break;. 
86b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
86c0: 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53  S:  zOp = "MINUS
86d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
86e0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
86f0: 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20   zOp = "PLUS";  
8700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8710: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f  e TK_BITNOT:  zO
8720: 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62  p = "BITNOT";  b
8730: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8740: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d  K_NOT:     zOp =
8750: 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61   "NOT";     brea
8760: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8770: 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49  SNULL:  zOp = "I
8780: 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  SNULL";  break;.
8790: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
87a0: 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e  ULL: zOp = "NOTN
87b0: 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
87c0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
87d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
87e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
87f0: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
8800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
8810: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
8820: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8830: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8840: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
8850: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
8860: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
8870: 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34    n += displayP4
8880: 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54  Expr(nTemp-n, zT
8890: 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c  emp+n, pExpr->pL
88a0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  eft);.    if( n<
88b0: 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70 72  nTemp-1 && pExpr
88c0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
88d0: 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27    zTemp[n++] = '
88e0: 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 64  ,';.      n += d
88f0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65  isplayP4Expr(nTe
8900: 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70  mp-n, zTemp+n, p
8910: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8920: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8930: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
8940: 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29  n, zTemp+n, ")")
8950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
8960: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8970: 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Temp);.}.#endif 
8980: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
8990: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
89a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
89b0: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
89c0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
89d0: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
89e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
89f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
8a00: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
8a10: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
8a20: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
8a30: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
8a40: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
8a50: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
8a60: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
8a70: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
8a80: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
8a90: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
8aa0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
8ab0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
8ac0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8ad0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
8ae0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
8af0: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
8b00: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
8b10: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8b20: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
8b30: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
8b40: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
8b50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8b60: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8b70: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
8b80: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
8b90: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
8ba0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
8bb0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
8bc0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
8bd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
8be0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8bf0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
8c00: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
8c10: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8c20: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
8c30: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
8c40: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
8c50: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
8c60: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
8c70: 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70  ( n==6 && memcmp
8c80: 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c  (zColl,"BINARY",
8c90: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
8ca0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a     zColl = "B";.
8cb0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
8cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8cd0: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
8ce0: 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -7 ){.          
8cf0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
8d00: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
8d10: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
8d20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8d40: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
8d50: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ';.        if( p
8d60: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8d70: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
8d80: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
8d90: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '-';.        }.
8da0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
8db0: 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c  zTemp[i], zColl,
8dc0: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69   n+1);.        i
8dd0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
8de0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8df0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
8e00: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
8e10: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
8e20: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
8e30: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
8e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8e50: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
8e60: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
8e70: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
8e80: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70  (nTemp, zTemp, p
8e90: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
8ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8eb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
8ec0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
8ed0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8ee0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
8ef0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
8f00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8f10: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32  mp, zTemp, "(%.2
8f20: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
8f30: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
8f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8f50: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
8f60: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8f70: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
8f80: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
8f90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8fa0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
8fb0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
8fc0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
8fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8ff0: 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BUG.    case P4_
9000: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
9010: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
9020: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
9030: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
9040: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9050: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
9060: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
9070: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
9080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9090: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
90a0: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
90b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
90c0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
90d0: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
90e0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
90f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9100: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
9110: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9130: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
9140: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
9150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9160: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
9170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9180: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9190: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
91a0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
91b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
91d0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
91e0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
91f0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
9200: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9210: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
9220: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
9230: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9240: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9250: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
9260: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9270: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
9280: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
9290: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
92a0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
92b0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
92d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
92e0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
92f0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
9300: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9310: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9330: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9340: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
9350: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9360: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9370: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9380: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
9390: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
93a0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
93c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
93d0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
93e0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
93f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9400: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9410: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9420: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9440: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
9450: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
9460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9470: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9480: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
9490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94a0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94b0: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
94c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
94d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
94e0: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
94f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9500: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9510: 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  p, "program");. 
9520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9530: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
9540: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
9550: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9570: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
9580: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
9590: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
95a0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
95b0: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
95c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
95d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
95e0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
95f0: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
9600: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
9610: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
9620: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
9630: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
9640: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
9650: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
9660: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
9670: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
9680: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
9690: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
96a0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
96b0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
96c0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
96d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
96e0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
96f0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
9700: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
9710: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
9720: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
9730: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
9740: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
9750: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
9760: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
9770: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
9780: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9790: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
97a0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
97b0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
97c0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
97d0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
97e0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
97f0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
9800: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
9810: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
9820: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
9830: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
9840: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
9850: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
9860: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
9870: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
9880: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
9890: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
98a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
98b0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
98c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
98d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
98e0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
98f0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9900: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
9910: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
9920: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
9930: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
9940: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9950: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
9960: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
9970: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
9980: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
9990: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
99a0: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
99b0: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
99c0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
99d0: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
99e0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
99f0: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
9a00: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
9a10: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
9a20: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
9a30: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
9a40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
9a50: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
9a60: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
9a70: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9a80: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
9a90: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
9aa0: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
9ab0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
9ac0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
9ad0: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
9ae0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
9af0: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
9b00: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
9b10: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
9b20: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
9b30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
9b40: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
9b50: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
9b60: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
9b70: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
9b80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
9b90: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
9ba0: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
9bb0: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
9bc0: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
9bd0: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
9be0: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
9bf0: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
9c00: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
9c10: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
9c20: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
9c30: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
9c40: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
9c50: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
9c60: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
9c70: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
9c80: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
9c90: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
9ca0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
9cb0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
9cc0: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
9cd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9ce0: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
9cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
9d00: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
9d10: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
9d20: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9d30: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9d40: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9d50: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9d60: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
9d70: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
9d80: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
9d90: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
9da0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
9db0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
9dc0: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
9dd0: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
9de0: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
9df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9e00: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
9e10: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
9e20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
9e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9e40: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9e50: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
9e60: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
9e70: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
9e80: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
9e90: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
9ea0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
9eb0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  eEnter()..*/.sta
9ec0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
9ed0: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61  INE void vdbeLea
9ee0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
9ef0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
9f00: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
9f10: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20    int nDb;.  db 
9f20: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
9f30: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
9f40: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
9f50: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
9f60: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
9f70: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
9f80: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
9f90: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
9fa0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
9fb0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
9fc0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
9fd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
9fe0: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
9ff0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
a000: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a010: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a020: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a030: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64  mon case */.  vd
a040: 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65  beLeave(p);.}.#e
a050: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
a060: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
a070: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
a080: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
a090: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
a0a0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
a0b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
a0c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
a0d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a0e0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
a0f0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
a100: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
a110: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
a120: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
a130: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
a140: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
a150: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
a160: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
a170: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
a180: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
a190: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
a1a0: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
a1b0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
a1c0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
a1d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a1e0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a1f0: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
a200: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
a210: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
a220: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
a230: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
a240: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
a250: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
a260: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
a270: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
a280: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
a290: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
a2a0: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
a2b0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
a2c0: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
a2d0: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
a2e0: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
a2f0: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
a300: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
a310: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
a320: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
a330: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
a340: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
a350: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
a360: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
a370: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
a380: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
a390: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
a3a0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
a3b0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
a3c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a3d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
a3e0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
a3f0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
a400: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
a410: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
a420: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a430: 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69     u8 malloc_fai
a440: 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
a450: 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20  Failed;.    if( 
a460: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
a470: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
a480: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
a490: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
a4a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
a4b0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
a4c0: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
a4d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
a4f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
a500: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
a510: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
a520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a530: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a540: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
a550: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
a560: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
a570: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
a580: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
a590: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
a5a0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
a5b0: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
a5c0: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
a5d0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
a5e0: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
a5f0: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
a600: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
a610: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
a620: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
a630: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
a640: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
a650: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
a660: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
a670: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
a680: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
a690: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
a6a0: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
a6b0: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
a6c0: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
a6d0: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
a6e0: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
a6f0: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
a700: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
a710: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
a720: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
a730: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
a740: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
a750: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
a760: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
a770: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
a780: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
a790: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
a7a0: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
a7b0: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
a7c0: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
a7d0: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
a7e0: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
a7f0: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
a800: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
a810: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
a820: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
a830: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
a850: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a860: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a870: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
a880: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
a890: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
a8a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a8b0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
a8c0: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
a8d0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
a8e0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
a8f0: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
a900: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
a910: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
a920: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
a930: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
a940: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
a950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a960: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
a970: 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c         p->szMall
a980: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
a990: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
a9a0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
a9b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
a9c0: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 64  p)<pEnd );.    d
a9d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a9e0: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
a9f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
aa00: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
aa10: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
aa20: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
aa30: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
aa40: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
aa50: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
aa60: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
aa70: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
aa80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
aa90: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
aaa0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
aab0: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
aac0: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
aad0: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
aae0: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
aaf0: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
ab00: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
ab10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
ab20: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
ab30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
ab40: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
ab50: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
ab60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
ab70: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
ab80: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
ab90: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
aba0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
abb0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
abc0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
abd0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
abe0: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
abf0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
ac00: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
ac10: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ac20: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
ac30: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
ac40: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
ac50: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
ac60: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
ac70: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
ac80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
ac90: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
aca0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
acb0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
acc0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
acd0: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
ace0: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
acf0: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
ad00: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
ad10: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
ad20: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
ad30: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
ad40: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
ad50: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
ad60: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
ad70: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
ad80: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
ad90: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
ada0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
adb0: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
adc0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
add0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
ade0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
adf0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
ae00: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
ae10: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
ae20: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
ae30: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ae50: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
ae60: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
ae90: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
aea0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
aeb0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
aee0: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
aef0: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
af00: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af20: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
af30: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
af40: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af60: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
af70: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
af80: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
af90: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afb0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
afc0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
afd0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
b000: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
b010: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
b020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b030: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
b040: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
b050: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
b060: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
b070: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
b080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
b090: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
b0a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
b0b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
b0c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
b0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b0e0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
b0f0: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
b100: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
b110: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
b120: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
b130: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
b140: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
b150: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
b160: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
b170: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
b180: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
b190: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
b1a0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
b1b0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
b1c0: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
b1d0: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
b1e0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b1f0: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
b200: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
b210: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
b220: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
b230: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
b240: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
b250: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
b260: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b270: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
b280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b290: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
b2a0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
b2b0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
b2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
b2e0: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
b2f0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
b300: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
b310: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
b320: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
b330: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
b340: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
b350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b360: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
b370: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
b380: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b390: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
b3a0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
b3b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
b3c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
b3d0: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
b3e0: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
b3f0: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
b400: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
b410: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
b420: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
b430: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
b440: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
b450: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
b460: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
b470: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
b480: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
b490: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
b4a0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
b4b0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
b4c0: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
b4d0: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
b4e0: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
b4f0: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
b500: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
b510: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
b520: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
b530: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
b540: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
b550: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
b560: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
b570: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
b580: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
b590: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
b5a0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
b5b0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
b5c0: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
b5d0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
b5e0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
b5f0: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
b600: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
b610: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
b620: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
b630: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
b640: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
b650: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
b660: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
b670: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
b680: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
b690: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
b6a0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
b6b0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
b6c0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
b6d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
b6e0: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
b6f0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
b700: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
b710: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
b720: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
b730: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
b740: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
b750: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
b760: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
b770: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
b780: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
b790: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
b7a0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
b7b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
b7c0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b7d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b7e0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
b7f0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b800: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
b810: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
b820: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
b830: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
b840: 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  .    char *zP4;.
b850: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
b860: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
b870: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
b880: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
b890: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
b8a0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
b8b0: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
b8c0: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
b8d0: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
b8e0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
b8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
b900: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
b910: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
b920: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
b930: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
b940: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
b950: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b960: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
b970: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
b980: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
b990: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
b9a0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
b9b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
b9c0: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
b9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
b9e0: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
b9f0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
ba00: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
ba10: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
ba20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ba30: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
ba40: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
ba70: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ba80: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
ba90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
baa0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
bab0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
bac0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
bad0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
bae0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
baf0: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
bb00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
bb10: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
bb20: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
bb30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
bb40: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
bb50: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
bb60: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
bb70: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
bb80: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
bb90: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
bba0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
bbb0: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
bbc0: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
bbd0: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
bbe0: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
bbf0: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
bc00: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
bc10: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
bc20: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
bc30: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
bc40: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
bc50: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
bc60: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
bc70: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
bc80: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
bc90: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
bca0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
bcb0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
bcc0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
bcd0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
bce0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
bcf0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
bd00: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
bd10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
bd20: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
bd30: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
bd40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bd50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
bd60: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
bd70: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
bd80: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
bd90: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
bda0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
bdb0: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
bdc0: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
bdd0: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
bde0: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
bdf0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
be00: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
be10: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
be20: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
be30: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
be40: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
be50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
be60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
be70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
be80: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
be90: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P1 */.    pMem++
bec0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
bed0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
bee0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
bef0: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
bf20: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
bf30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
bf40: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
bf50: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
bf80: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
bf90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
bfa0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
bfb0: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
bfc0: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
bfd0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
bfe0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c000: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
c010: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c020: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c030: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
c040: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
c050: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29   pMem->szMalloc)
c060: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
c070: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
c080: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c090: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
c0a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
c0b0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
c0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c0d0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c0e0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c0f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c100: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c110: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c120: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
c130: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
c140: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
c150: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c160: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
c170: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
c180: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c190: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c1a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c1b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c1c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c1d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c1e0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c1f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c200: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
c210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c220: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
c230: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
c240: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
c250: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c260: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
c270: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
c280: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
c290: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
c2a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c2b0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c2c0: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
c2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c2e0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c2f0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c300: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c310: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c320: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c330: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c340: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c350: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
c360: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
c370: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
c380: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c390: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
c3a0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
c3b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
c3e0: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
c3f0: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
c400: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
c410: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
c420: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
c430: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
c440: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c450: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
c460: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
c470: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
c480: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c490: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
c4a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c4b0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
c4c0: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
c4d0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
c4e0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
c4f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c500: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
c510: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
c520: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
c530: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
c540: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
c550: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
c560: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
c570: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
c580: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
c590: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
c5a0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
c5b0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
c5c0: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
c5d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
c5e0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
c5f0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
c600: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
c610: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
c620: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
c630: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c640: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
c650: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c660: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
c670: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
c680: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
c690: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
c6a0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
c6b0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
c6c0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
c6d0: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
c6e0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
c6f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
c700: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
c710: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
c720: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
c730: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
c740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
c750: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
c760: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
c770: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
c780: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
c790: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
c7a0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
c7b0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
c7c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
c7d0: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c7e0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
c7f0: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
c800: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c810: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c820: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c830: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
c840: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
c850: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
c860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c870: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
c880: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
c890: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
c8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
c8b0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
c8c0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
c8d0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
c8e0: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
c8f0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
c900: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
c910: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
c920: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
c930: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
c940: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
c950: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
c960: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
c970: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
c980: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c990: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
c9a0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
c9b0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
c9c0: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
c9d0: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
c9e0: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
c9f0: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
ca00: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
ca10: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
ca20: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
ca30: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
ca40: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ca50: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
ca60: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
ca70: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
ca80: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
ca90: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
caa0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
cab0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
cac0: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
cad0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
cae0: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
caf0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
cb00: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cb10: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
cb20: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
cb30: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
cb40: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
cb50: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
cb60: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
cb70: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
cb80: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
cb90: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
cba0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
cbb0: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
cbc0: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
cbd0: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
cbe0: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
cbf0: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
cc00: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
cc10: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
cc20: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
cc30: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
cc40: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
cc50: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
cc60: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
cc70: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
cc80: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
cc90: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
cca0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
ccb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ccc0: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
ccd0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
cce0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
ccf0: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
cd00: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
cd10: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
cd20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd30: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
cd40: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
cd50: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
cd60: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
cd70: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
cd80: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
cd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
cda0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
cdb0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
cdc0: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
cdd0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
cde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
cdf0: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
ce00: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
ce10: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
ce20: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
ce30: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ce40: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
ce50: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
ce60: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
ce70: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
ce80: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
ce90: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
cea0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
ceb0: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
cec0: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
ced0: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
cee0: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
cef0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
cf00: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
cf10: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
cf20: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
cf30: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
cf40: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
cf50: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
cf60: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
cf70: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
cf80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
cf90: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
cfa0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
cfb0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
cfc0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
cfd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
cfe0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
cff0: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
d000: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
d010: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
d020: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d030: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
d040: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
d050: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
d060: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
d070: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
d080: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d090: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
d0a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d0b0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
d0c0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
d0d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
d0e0: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
d0f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
d100: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
d110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d120: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
d130: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
d140: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
d150: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
d160: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
d170: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
d180: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
d190: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
d1a0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
d1b0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
d1c0: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
d1d0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
d1e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d1f0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
d200: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
d210: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
d220: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
d230: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
d240: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
d250: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
d260: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
d270: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
d280: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
d290: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d2a0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
d2b0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
d2c0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
d2d0: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
d2e0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
d2f0: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
d300: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
d310: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
d320: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
d330: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
d340: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
d350: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
d360: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
d370: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
d380: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
d390: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
d3a0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
d3b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d3c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
d3d0: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
d3e0: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
d3f0: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
d400: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
d410: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
d420: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d440: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
d450: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
d460: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
d470: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
d480: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
d490: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
d4a0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
d4b0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
d4c0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
d4d0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
d4e0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
d4f0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
d500: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
d510: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
d520: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d530: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
d540: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
d550: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
d560: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
d570: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
d580: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
d590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d5a0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
d5b0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5d0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
d5e0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d600: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d610: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d620: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
d630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d640: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d650: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
d660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d680: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
d690: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d6c0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
d6d0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
d6e0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
d6f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d700: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
d710: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
d720: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d740: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d750: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
d760: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d790: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
d7a0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
d7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d7d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d7e0: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d800: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
d810: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
d820: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d850: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
d860: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
d870: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d890: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
d8a0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
d8b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
d8c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d8d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
d8e0: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
d8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d900: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
d910: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
d920: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
d930: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
d940: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
d950: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d960: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
d970: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
d980: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
d990: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
d9a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
d9b0: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
d9c0: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63  >nMaxArg;.  nOnc
d9d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  e = pParse->nOnc
d9e0: 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d  e;.  if( nOnce==
d9f0: 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f  0 ) nOnce = 1; /
da00: 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73  * Ensure at leas
da10: 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d  t one byte in p-
da20: 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a  >aOnceFlag[] */.
da30: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
da40: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
da50: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
da60: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
da70: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
da80: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
da90: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
daa0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
dab0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
dac0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
dad0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
dae0: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
daf0: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
db00: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
db10: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
db20: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
db30: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
db40: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
db50: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
db60: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
db70: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
db80: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
db90: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
dba0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
dbb0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
dbc0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
dbd0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
dbe0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
dbf0: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
dc00: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
dc10: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
dc20: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
dc30: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
dc40: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
dc50: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
dc60: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
dc70: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
dc80: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
dc90: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
dca0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20  ->nOp];         
dcb0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
dcc0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
dcd0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
dce0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
dcf0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  Parse->nOpAlloc]
dd00: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
dd10: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
dd20: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
dd30: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
dd40: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
dd50: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
dd60: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
dd70: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
dd80: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
dd90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
dda0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
ddb0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
ddc0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
ddd0: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
dde0: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
ddf0: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
de00: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
de10: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
de20: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
de30: 65 64 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78  ed = 0;..  p->ex
de40: 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20  pired = 0;.  .  
de50: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
de60: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
de70: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
de80: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
de90: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
dea0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
deb0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
dec0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
ded0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
dee0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
def0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
df00: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
df10: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
df20: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
df30: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
df40: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
df50: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
df60: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
df70: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
df80: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
df90: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
dfa0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
dfb0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
dfc0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
dfd0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
dfe0: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
dff0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
e000: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
e010: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
e020: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
e030: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
e040: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
e050: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
e060: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
e070: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
e080: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
e090: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
e0a0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
e0b0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
e0c0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
e0d0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
e0e0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
e0f0: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
e100: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
e110: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
e120: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
e130: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
e140: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
e150: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
e160: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
e170: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
e180: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
e190: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
e1a0: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
e1b0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
e1c0: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
e1d0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
e1e0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
e1f0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
e200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
e220: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
e230: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
e240: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
e250: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
e260: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
e270: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
e280: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e290: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
e2a0: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
e2b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
e2c0: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
e2d0: 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c  eof(i64), &zCsr,
e2e0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
e2f0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e  #endif.    if( n
e300: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
e310: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
e320: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e330: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
e340: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
e350: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
e360: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
e370: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
e380: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e390: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
e3a0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
e3b0: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
e3c0: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
e3d0: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
e3e0: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
e3f0: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
e400: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
e410: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
e420: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
e430: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
e440: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
e450: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
e460: 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a  ar && pParse->nz
e470: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  Var>0 ){.    p->
e480: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
e490: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
e4a0: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
e4b0: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
e4c0: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
e4d0: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
e4e0: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
e4f0: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
e500: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
e510: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
e520: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
e530: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
e540: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
e550: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
e560: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
e570: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
e580: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
e590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
e5a0: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
e5b0: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
e5c0: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
e5d0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
e5e0: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
e5f0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
e600: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
e610: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e620: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
e630: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
e640: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
e650: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
e660: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
e670: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
e680: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
e690: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
e6a0: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
e6b0: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
e6c0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
e6d0: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
e6e0: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
e6f0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
e700: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e710: 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
e720: 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  Bt==0 || pCx->eC
e730: 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
e740: 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
e750: 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
e760: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
e770: 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
e780: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e790: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
e7a0: 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
e7b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e7c0: 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
e7d0: 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
e7e0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
e7f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e800: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
e810: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e820: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
e830: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
e840: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
e850: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
e860: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
e870: 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
e880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
e890: 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
e8a0: 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
e8b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e8c0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
e8d0: 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
e8e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e8f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
e900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
e910: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
e920: 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
e930: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
e940: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
e950: 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
e960: 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
e970: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
e980: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
e990: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
e9a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e9b0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
e9c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
e9d0: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
e9e0: 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
e9f0: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
ea00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ea10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
ea20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ea30: 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
ea40: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
ea50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ea60: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
ea70: 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
ea80: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
ea90: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
eaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
eab0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
eac0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
ead0: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
eae0: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
eaf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eb00: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
eb10: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
eb20: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
eb30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
eb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
eb50: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
eb60: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
eb70: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
eb80: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
eb90: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
eba0: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
ebb0: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
ebc0: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
ebd0: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
ebe0: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
ebf0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
ec00: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
ec10: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
ec20: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
ec30: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
ec40: 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
ec50: 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
ec60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ec70: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
ec80: 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
ec90: 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
eca0: 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ndif.  v->aOnceF
ecb0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
ecc0: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
ecd0: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
ece0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
ecf0: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
ed00: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
ed10: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
ed20: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
ed30: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
ed40: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
ed50: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
ed60: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
ed70: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
ed80: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
ed90: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
eda0: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
edb0: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
edc0: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
edd0: 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
ede0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
edf0: 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  nDbChange;.  ret
ee00: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
ee10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ee20: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
ee30: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
ee40: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
ee50: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
ee60: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
ee70: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
ee80: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
ee90: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
eea0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
eeb0: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
eec0: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
eed0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
eee0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
eef0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
ef00: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
ef10: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
ef20: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
ef30: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
ef40: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
ef50: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
ef60: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
ef70: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
ef80: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
ef90: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
efa0: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
efb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
efc0: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
efd0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
efe0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
eff0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
f000: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
f010: 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
f020: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
f030: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
f040: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
f050: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
f060: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
f070: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
f080: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
f090: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
f0a0: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
f0b0: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
f0c0: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
f0d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f0e0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
f0f0: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
f100: 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
f110: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
f120: 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
f130: 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61   if( p->pAuxData
f140: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
f150: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d  leteAuxData(p, -
f160: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
f170: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
f180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
f190: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
f1a0: 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a  r a single run..
f1b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
f1c0: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
f1d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f1e0: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
f1f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f200: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
f210: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
f220: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
f230: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
f240: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
f250: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
f260: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
f270: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
f280: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
f290: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
f2a0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
f2b0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
f2c0: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
f2d0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
f2e0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
f2f0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
f300: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
f310: 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69  lags==MEM_Undefi
f320: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ned );.  }.#endi
f330: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
f340: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
f350: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
f360: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
f370: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
f380: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
f390: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
f3a0: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
f3b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
f3c0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
f3d0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
f3e0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
f3f0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
f400: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
f410: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
f420: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
f430: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
f440: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
f450: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
f460: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
f470: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
f480: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
f490: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
f4a0: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
f4b0: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
f4c0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
f4d0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
f4e0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
f4f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
f500: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
f510: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
f520: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
f530: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f540: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
f550: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
f560: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
f570: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
f580: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
f590: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
f5a0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
f5b0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
f5c0: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
f5d0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
f5e0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
f5f0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
f600: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
f610: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
f620: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
f630: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
f640: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
f650: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
f660: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f670: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
f680: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
f690: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
f6a0: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
f6b0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
f6c0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
f6d0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
f6e0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
f6f0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
f700: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
f710: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
f720: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
f730: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
f740: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
f750: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
f760: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
f770: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
f780: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
f790: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
f7a0: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
f7b0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
f7c0: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
f7d0: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
f7e0: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
f7f0: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
f800: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
f810: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
f820: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
f850: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
f860: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
f890: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
f8a0: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
f8b0: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f8d0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
f8e0: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
f8f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
f900: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
f910: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
f920: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
f930: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
f940: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
f950: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
f960: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
f970: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
f980: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
f990: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
f9a0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
f9b0: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
f9c0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
f9d0: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
f9e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
f9f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fa00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
fa10: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
fa20: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
fa30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
fa50: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
fa60: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
fa70: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
fa80: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
fa90: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
faa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
fab0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
fac0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
fad0: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
fae0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
faf0: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
fb00: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
fb10: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
fb20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fb30: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
fb40: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
fb50: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
fb60: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
fb70: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
fb80: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
fb90: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
fba0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
fbb0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
fbc0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
fbd0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
fbe0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
fbf0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
fc00: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
fc10: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
fc20: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
fc30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
fc40: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
fc50: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
fc60: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
fc70: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
fc80: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
fc90: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
fca0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
fcb0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
fcc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
fcd0: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
fce0: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
fcf0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
fd00: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
fd10: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
fd20: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
fd30: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
fd40: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
fd50: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
fd60: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
fd70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
fd80: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
fd90: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
fda0: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
fdb0: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
fdc0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
fdd0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
fde0: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
fdf0: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
fe00: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
fe10: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
fe20: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
fe30: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
fe40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
fe50: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
fe60: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
fe70: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
fe80: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
fe90: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
fea0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
feb0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
fec0: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
fed0: 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20   p);..  /* This 
fee0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
fef0: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
ff00: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
ff10: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
ff20: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
ff30: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
ff40: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
ff50: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
ff60: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
ff70: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
ff80: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
ff90: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
ffa0: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
ffb0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
ffc0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
ffd0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
ffe0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
fff0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
10000 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
10010 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
10020 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
10030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
10040 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
10050 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
10060 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10070 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10080 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
10090 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
100a0 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
100b0 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
100c0 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  nTrans++;.      
100d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
100e0 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  r(pBt);.      rc
100f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
10100 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
10110 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
10120 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Bt));.      sqli
10130 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
10140 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
10150 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10160 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10170 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
10180 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
10190 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
101a0 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
101b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
101c0 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
101d0 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
101e0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
101f0 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
10200 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
10210 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
10220 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10240 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
10250 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
10260 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
10270 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
10280 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
10290 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
102a0 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
102b0 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
102c0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
102d0 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
102e0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
102f0 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
10300 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
10310 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
10320 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
10330 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10340 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
10350 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
10360 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
10370 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
10380 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
10390 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
103a0 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
103b0 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
103c0 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
103d0 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
103e0 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
103f0 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
10400 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
10410 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
10420 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
10430 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
10440 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
10450 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
10460 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10470 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10480 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
10490 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
104a0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
104b0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
104c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
104d0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
104e0 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
104f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10500 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
10510 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
10520 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
10530 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
10540 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
10550 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
10560 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
10570 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
10580 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
10590 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
105a0 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
105b0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
105c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
105d0 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
105e0 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
105f0 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
10600 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
10610 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
10620 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
10630 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
10640 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10650 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
10670 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10680 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10690 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
106a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
106b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
106c0 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
106d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
106e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
106f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10700 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
10710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
10720 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
10730 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
10740 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
10750 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
10760 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
10770 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
10780 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
10790 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
107a0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
107b0 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c  mitted atomicall
107c0 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
107d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
107e0 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
107f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10800 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
10810 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
10820 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
10830 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
10840 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
10850 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10860 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
10870 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
10880 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10890 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
108a0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
108b0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
108c0 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
108d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
108e0 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
108f0 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
10900 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
10910 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
10920 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
10930 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
10940 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
10950 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10960 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
10970 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
10980 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
10990 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
109a0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
109b0 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
109c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
109d0 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  OMEM;.    do {. 
109e0 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
109f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
10a00 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
10a10 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
10a20 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
10a30 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10a40 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
10a50 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
10a60 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
10a70 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10a80 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
10a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
10aa0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
10ab0 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
10ac0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
10ad0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
10ae0 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
10af0 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
10b00 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
10b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
10b20 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
10b30 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
10b40 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
10b50 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
10b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10b70 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
10b80 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
10b90 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
10ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
10bd0 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
10be0 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
10bf0 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
10c00 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
10c10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10c20 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
10c30 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
10c40 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
10c50 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
10c60 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
10c70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
10c80 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
10c90 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
10ca0 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
10cb0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
10cc0 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
10cd0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
10cf0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
10d00 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
10d10 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
10d20 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
10d30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
10d40 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
10d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10d60 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
10d70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
10d80 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
10d90 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
10da0 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
10db0 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
10dc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10dd0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
10de0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
10df0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
10e00 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
10e10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
10e20 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
10e30 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
10e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
10e60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10e70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
10e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10e90 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
10ea0 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
10eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
10ec0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10ed0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
10ee0 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
10ef0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
10f00 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
10f10 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
10f20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
10f30 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10f40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
10f50 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
10f60 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
10f70 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
10f80 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
10f90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
10fa0 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
10fb0 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
10fc0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
10fd0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
10fe0 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
10ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11000 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11010 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11020 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11030 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11040 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11050 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
11060 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
11070 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
11080 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
11090 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
110a0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
110b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
110c0 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
110d0 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
110e0 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
110f0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
11100 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
11110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e  ;.        if( !n
11120 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69  eedSync && !sqli
11130 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
11140 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20  bled(pBt) ){.   
11150 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
11160 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
11170 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11180 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
11190 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
111a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
111b0 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
111c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
111d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
111e0 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
111f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11210 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
11220 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
11230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11240 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11250 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11260 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11270 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11280 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11290 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
112a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
112b0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
112c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
112d0 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
112e0 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
112f0 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
11300 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
11310 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
11320 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
11330 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d  ync .     && 0==
11340 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
11350 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
11360 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
11370 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
11380 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
11390 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
113a0 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
113b0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
113c0 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
113d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
113e0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
113f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
11400 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11410 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
11420 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11430 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11450 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
11460 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
11470 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
11480 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
11490 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
114a0 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
114b0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
114c0 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
114d0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
114e0 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
114f0 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
11500 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11510 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11520 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
11530 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
11540 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
11550 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
11560 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
11570 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11580 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
11590 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
115a0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
115b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
115c0 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
115d0 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
115e0 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
115f0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11610 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
11620 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
11630 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
11640 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
11650 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
11660 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
11670 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
11680 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
11690 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
116a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
116b0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
116c0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
116d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
116e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
116f0 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
11700 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11710 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11720 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11730 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
11740 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
11750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11770 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11780 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
117a0 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
117b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
117c0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
117d0 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
117e0 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
117f0 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
11800 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
11810 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
11820 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
11830 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
11840 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
11850 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
11860 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11870 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11880 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29  aster, needSync)
11890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
118a0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
118b0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
118c0 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
118d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
118e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
118f0 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
11900 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
11910 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
11920 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
11930 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
11940 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
11950 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
11960 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
11970 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
11980 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
11990 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
119a0 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
119b0 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
119c0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
119d0 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
119e0 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
119f0 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
11a00 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
11a10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
11a20 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
11a30 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
11a40 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
11a50 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
11a60 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
11a70 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
11a80 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
11a90 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
11aa0 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
11ab0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
11ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
11ad0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11ae0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11af0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
11b00 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11b10 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
11b20 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
11b30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
11b40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
11b50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
11b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
11b80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11b90 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
11ba0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
11bb0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
11bc0 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
11bd0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
11be0 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
11bf0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
11c00 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
11c10 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
11c20 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
11c30 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
11c40 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
11c50 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
11c60 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
11c70 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
11c80 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
11c90 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
11ca0 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
11cb0 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
11cc0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
11cd0 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
11ce0 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
11cf0 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
11d00 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
11d10 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
11d20 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
11d30 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
11d40 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
11d50 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
11d60 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
11d70 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
11d80 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
11d90 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
11da0 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
11db0 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
11dc0 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
11dd0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
11de0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73  te3_stmt_busy((s
11df0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20  qlite3_stmt*)p) 
11e00 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
11e10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
11e20 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
11e30 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
11e40 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52  ->bIsReader ) nR
11e50 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ead++;.    }.   
11e60 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
11e70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
11e80 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ==db->nVdbeActiv
11e90 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
11ea0 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65  Write==db->nVdbe
11eb0 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72  Write );.  asser
11ec0 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56  t( nRead==db->nV
11ed0 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c  dbeRead );.}.#el
11ee0 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
11ef0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
11f00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11f10 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
11f20 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
11f30 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
11f40 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
11f50 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
11f60 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
11f70 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
11f80 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
11f90 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
11fa0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
11fb0 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
11fc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
11fd0 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
11fe0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11ff0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
12000 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
12010 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
12020 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
12030 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12040 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
12050 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
12060 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
12070 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
12080 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
12090 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
120a0 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
120b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
120c0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
120d0 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
120e0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
120f0 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
12100 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12110 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
12120 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73  p->iStatement is
12130 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
12140 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64  ro, then this Vd
12150 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a  be opened a .  *
12160 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
12170 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f  saction that sho
12180 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65  uld be closed he
12190 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63  re. The only exc
121a0 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  eption.  ** is t
121b0 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hat an IO error 
121c0 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
121d0 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d  d, causing an em
121e0 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
121f0 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
12200 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d  ase (db->nStatem
12210 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65  ent==0), and the
12220 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
12230 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   do..  */.  if( 
12240 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26  db->nStatement &
12250 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  & p->iStatement 
12260 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12270 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
12280 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
12290 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
122a0 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
122b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
122c0 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
122d0 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
122e0 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
122f0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
12300 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
12310 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
12320 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
12330 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
12340 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
12350 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
12360 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
12370 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
12380 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
12390 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
123a0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
123b0 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
123c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
123d0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
123e0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
123f0 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
12400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
12410 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12430 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
12440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
12450 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
12460 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
12470 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12480 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
124a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
124b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
124c0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
124d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
124e0 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
124f0 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
12500 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
12510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
12530 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12540 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12560 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
12570 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
12580 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
12590 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
125a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
125b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
125c0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
125d0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
125e0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
125f0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12600 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12610 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
12620 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12630 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
12640 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
12650 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  re the .    ** d
12660 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
12670 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
12680 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
12690 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
126a0 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  when .    ** the
126b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
126c0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
126d0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
126e0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
126f0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
12700 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12710 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
12720 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  ons;.      db->n
12730 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
12740 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d  = p->nStmtDefImm
12750 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
12760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12770 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12780 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12790 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
127a0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
127b0 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
127c0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
127d0 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
127e0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
127f0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
12800 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
12810 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
12820 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
12830 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
12840 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
12850 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
12860 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
12870 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
12880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
12890 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
128a0 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
128b0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
128c0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
128d0 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
128e0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
128f0 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
12900 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
12910 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
12920 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
12930 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
12940 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12950 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12960 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
12970 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
12980 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
12990 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
129a0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
129b0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
129c0 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
129d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
129e0 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
129f0 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
12a00 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
12a10 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
12a20 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
12a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
12a40 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
12a50 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
12a60 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
12a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12a80 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
12a90 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
12aa0 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
12ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12ac0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
12ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12ae0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
12af0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12b00 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
12b10 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
12b20 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
12b30 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
12b40 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
12b50 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
12b60 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
12b70 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
12b80 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
12b90 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
12ba0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
12bb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12bc0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
12bd0 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
12be0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
12bf0 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
12c00 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
12c10 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
12c20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
12c30 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
12c40 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
12c50 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
12c60 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
12c70 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
12c80 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
12c90 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
12ca0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
12cb0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
12cc0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
12cd0 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
12ce0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
12cf0 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
12d00 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
12d10 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
12d20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
12d30 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
12d40 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
12d50 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
12d80 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
12d90 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
12da0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12db0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
12dc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
12dd0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
12de0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
12df0 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
12e00 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
12e10 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
12e20 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
12e30 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
12e40 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
12e50 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
12e60 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
12e70 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
12e80 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
12e90 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
12ea0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
12eb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
12ec0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
12ed0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
12ee0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
12ef0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
12f00 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
12f10 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
12f20 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
12f30 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
12f40 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
12f50 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
12f60 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
12f70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12f80 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
12f90 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
12fa0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
12fb0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
12fc0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
12fd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
12fe0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
12ff0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13000 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
13020 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46  .  if( p->aOnceF
13030 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e  lag ) memset(p->
13040 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
13050 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63  >nOnceFlag);.  c
13060 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
13070 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
13080 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
13090 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
130a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
130b0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
130c0 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
130d0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
130e0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
130f0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
13100 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
13110 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
13120 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
13130 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
13140 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
13150 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
13160 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
13170 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
13180 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
13190 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
131a0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
131b0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
131c0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
131d0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
131e0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
131f0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
13200 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
13210 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
13220 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
13230 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
13240 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
13250 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
13260 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
13270 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
13280 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
13290 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
132a0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
132b0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
132c0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
132d0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
132f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
13300 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
13310 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
13320 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
13330 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
13340 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
13350 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
13360 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
13370 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
13380 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
13390 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
133a0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
133b0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
133c0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
133d0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
133e0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
133f0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
13400 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
13410 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
13420 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
13430 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
13440 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
13450 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
13460 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
13470 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
13480 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
13490 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
134a0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
134b0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
134c0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
134d0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
134e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
134f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
13500 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
13510 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
13520 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
13530 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
13540 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
13550 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
13560 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
13570 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
13580 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
13590 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
135a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
135b0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
135c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
135d0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
135e0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
135f0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
13600 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
13610 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
13620 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
13630 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
13640 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
13650 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
13660 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
13670 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
13680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13690 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
136a0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
136b0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
136c0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
136d0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
136e0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
136f0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
13700 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
13710 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
13720 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13740 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
13750 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
13760 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
13770 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
13780 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
13790 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
137a0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
137b0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
137c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
137d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
137e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
137f0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
13800 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
13810 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
13820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13840 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
13850 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
13860 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
13870 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
13880 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
13890 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
138a0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
138b0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
138c0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
138d0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
138e0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
138f0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
13900 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
13910 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
13920 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
13930 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
13940 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
13950 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
13960 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
13970 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
13980 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
13990 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
139a0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
139b0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
139c0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
139d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
139e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
139f0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
13a00 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
13a10 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
13a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13a30 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
13a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13a60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
13a70 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
13a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13a90 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
13aa0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
13ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13ac0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
13ad0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
13ae0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13af0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
13b00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
13b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13b20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
13b30 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
13b40 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
13b50 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
13b60 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
13b70 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
13b80 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
13b90 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
13ba0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
13bb0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
13bc0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
13bd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13be0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
13bf0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
13c00 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
13c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
13c20 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
13c30 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
13c40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
13c50 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
13c60 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
13c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13c80 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
13c90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13ca0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
13cb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
13cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13cd0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
13ce0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
13cf0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13d00 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
13d10 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
13d20 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
13d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d40 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
13d50 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
13d60 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
13d70 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
13d80 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
13d90 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
13da0 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
13db0 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
13dc0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
13dd0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
13de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13df0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
13e00 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
13e10 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
13e20 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
13e30 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
13e40 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
13e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
13e60 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
13e70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
13e90 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
13ea0 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
13eb0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
13ec0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
13ed0 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
13ee0 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
13ef0 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
13f00 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
13f10 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
13f20 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
13f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13f40 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13f50 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
13f60 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
13f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
13f80 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
13f90 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
13fa0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
13fb0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
13fc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
13fd0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
13fe0 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
13ff0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
14000 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
14010 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
14020 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
14030 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14040 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
14050 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14060 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
14070 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
14080 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
14090 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
140a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
140b0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
140c0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
140d0 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
140e0 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
140f0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
14100 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
14110 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
14120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14130 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
14140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14150 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14160 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
14170 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
14180 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
14190 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
141a0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
141b0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
141c0 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
141d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
141e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
141f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14200 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
14210 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14220 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14230 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14240 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14250 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14260 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14270 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14280 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14290 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
142a0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
142b0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
142c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
142d0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
142e0 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
142f0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
14300 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14310 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
14320 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
14330 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
14340 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14350 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
14360 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
14370 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
14380 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
14390 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
143a0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
143b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
143c0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
143d0 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
143e0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
143f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14400 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
14410 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
14420 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14430 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
14440 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
14450 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
14460 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
14470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
14480 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
14490 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
144a0 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
144b0 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
144c0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
144d0 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
144e0 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
144f0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
14500 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
14510 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
14520 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
14530 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
14540 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14550 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
14560 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
14570 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
14580 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
14590 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
145a0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
145b0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
145c0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
145d0 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
145e0 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
145f0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
14600 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14610 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
14620 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
14630 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
14640 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
14650 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
14660 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
14670 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
14680 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
14690 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
146a0 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
146b0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
146c0 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
146d0 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
146e0 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
146f0 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
14700 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
14710 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
14720 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
14730 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
14740 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
14750 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c  >nVdbeActive>0 |
14760 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
14770 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
14780 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
14790 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
147a0 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
147b0 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
147c0 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
147d0 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
147e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
147f0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
14800 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
14810 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
14820 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
14830 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
14840 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
14850 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14860 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
14870 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
14880 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
14890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
148a0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  the error code a
148b0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
148c0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
148d0 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a  e VDBE passed.**
148e0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
148f0 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61  gument to its da
14900 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73  tabase handle (s
14910 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
14920 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   be .** returned
14930 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
14940 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61  ite3_errcode() a
14950 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nd sqlite3_errms
14960 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  g())..**.** This
14970 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
14980 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42  ot clear the VDB
14990 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20  E error code or 
149a0 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a  message, just.**
149b0 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20   copies them to 
149c0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
149d0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
149e0 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
149f0 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  rror(Vdbe *p){. 
14a00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14a10 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
14a20 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d   p->rc;.  if( p-
14a30 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
14a40 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  u8 mallocFailed 
14a50 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
14a60 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ed;.    sqlite3B
14a70 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14a80 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ();.    if( db->
14a90 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45  pErr==0 ) db->pE
14aa0 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
14ab0 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
14ac0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
14ad0 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
14ae0 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
14af0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
14b00 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
14b10 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
14b20 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
14b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14b40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
14b50 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
14b60 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
14b70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14b80 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
14b90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
14ba0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14bb0 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20  SQLLOG./*.** If 
14bc0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  an SQLITE_CONFIG
14bd0 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20  _SQLLOG hook is 
14be0 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74  registered and t
14bf0 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72  he VM has been r
14c00 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69  un, .** invoke i
14c10 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
14c20 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  d vdbeInvokeSqll
14c30 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  og(Vdbe *v){.  i
14c40 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
14c50 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26  Config.xSqllog &
14c60 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & v->rc==SQLITE_
14c70 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26  OK && v->zSql &&
14c80 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   v->pc>=0 ){.   
14c90 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64   char *zExpanded
14ca0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
14cb0 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53  pandSql(v, v->zS
14cc0 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ql);.    assert(
14cd0 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73   v->db->init.bus
14ce0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
14cf0 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20  zExpanded ){.   
14d00 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
14d10 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a  Config.xSqllog(.
14d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14d30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
14d40 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c  qllogArg, v->db,
14d50 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20   zExpanded, 1.  
14d60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
14d70 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
14d80 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20  , zExpanded);.  
14d90 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
14da0 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76  # define vdbeInv
14db0 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e  okeSqllog(x).#en
14dc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
14dd0 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
14de0 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
14df0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
14e00 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
14e10 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
14e20 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
14e30 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
14e40 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
14e50 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
14e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14e70 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
14e80 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
14e90 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
14ea0 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
14eb0 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
14ec0 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
14ed0 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
14ee0 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
14ef0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
14f00 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
14f10 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
14f20 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
14f30 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
14f40 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
14f50 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
14f60 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
14f70 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
14f80 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
14f90 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
14fa0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
14fb0 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
14fc0 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
14fd0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
14fe0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
14ff0 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
15000 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
15010 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
15020 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
15030 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
15040 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
15050 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
15060 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
15070 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
15080 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
15090 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
150a0 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
150b0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
150c0 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
150d0 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
150e0 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
150f0 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
15100 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
15110 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
15120 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
15130 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15140 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
15150 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
15160 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15170 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
15180 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
15190 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
151a0 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
151b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
151c0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
151d0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
151e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
151f0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
15200 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
15210 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
15220 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
15230 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
15240 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
15250 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
15260 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
15270 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
15280 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
15290 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
152a0 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
152b0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
152c0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
152d0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
152e0 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
152f0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
15300 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
15310 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
15320 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
15330 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
15340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15350 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
15360 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
15370 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
15380 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
15390 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
153a0 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
153b0 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
153c0 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
153d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
153e0 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
153f0 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
15400 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
15410 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
15420 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
15430 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
15440 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
15450 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
15460 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
15470 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
15480 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
15490 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
154a0 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
154b0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
154c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
154d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
154e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
154f0 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
15500 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
15510 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
15520 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
15530 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15540 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
15550 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
15560 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
15570 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
15580 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
15590 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
155a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
155b0 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
155c0 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
155d0 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
155e0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
155f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15600 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
15610 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
15620 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
15630 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
15640 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
15650 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
15660 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
15670 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
15680 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
15690 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
156a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
156b0 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
156c0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
156d0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
156e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
156f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15700 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
15710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15720 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
15730 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
15740 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
15750 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
15760 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
15770 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
15780 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
15790 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
157a0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
157b0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
157c0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
157d0 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
157e0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
157f0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
15800 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
15810 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
15820 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
15830 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
15840 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
15850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15860 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
15870 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
15880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
15890 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
158a0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
158b0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
158c0 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
158d0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
158e0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
158f0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
15900 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
15910 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15920 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
15930 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15940 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
15950 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
15960 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
15970 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
15980 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
15990 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
159a0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
159b0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
159c0 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
159d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
159e0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
159f0 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
15a00 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
15a10 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
15a20 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
15a30 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
15a40 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
15a50 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
15a60 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
15a70 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
15a80 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
15a90 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
15aa0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
15ab0 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
15ac0 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
15ad0 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
15ae0 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
15af0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
15b00 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
15b10 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
15b20 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
15b30 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
15b40 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
15b50 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
15b60 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
15b70 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
15b80 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
15b90 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
15ba0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73  parameter corres
15bb0 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
15bc0 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
15bd0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
15be0 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64  uxData(Vdbe *pVd
15bf0 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  be, int iOp, int
15c00 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74   mask){.  AuxDat
15c10 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d  a **pp = &pVdbe-
15c20 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69  >pAuxData;.  whi
15c30 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
15c40 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
15c50 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
15c60 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
15c70 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28  x->iOp==iOp && (
15c80 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c  pAux->iArg>31 ||
15c90 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49   !(mask & MASKBI
15ca0 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29  T32(pAux->iArg))
15cb0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
15cc0 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e  testcase( pAux->
15cd0 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20  iArg==31 );.    
15ce0 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
15cf0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
15d00 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
15d10 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
15d20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41  }.      *pp = pA
15d30 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ux->pNext;.     
15d40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15d50 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b  Vdbe->db, pAux);
15d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d70 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
15d80 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
15d90 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
15da0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
15db0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
15dc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
15dd0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
15de0 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
15df0 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
15e00 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
15e10 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
15e20 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
15e30 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
15e40 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15e50 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
15e60 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
15e70 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
15e80 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
15e90 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
15ea0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
15eb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15ec0 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
15ed0 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
15ee0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
15ef0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
15f00 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
15f10 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
15f20 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
15f30 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15f40 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
15f50 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
15f60 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
15f70 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
15f80 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
15f90 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
15fa0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
15fb0 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
15fc0 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
15fd0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
15fe0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
15ff0 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
16000 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
16010 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
16020 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
16030 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16040 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
16050 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31  for(i=p->nzVar-1
16060 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c  ; i>=0; i--) sql
16070 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16080 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76  ->azVar[i]);.  v
16090 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
160a0 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
160b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
160c0 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
160d0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
160e0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
160f0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
16100 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
16110 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16120 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
16130 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d  NSTATUS.  for(i=
16140 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69  0; i<p->nScan; i
16150 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
16160 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53  DbFree(db, p->aS
16170 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  can[i].zName);. 
16180 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
16190 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
161a0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
161b0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
161c0 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
161d0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
161e0 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
161f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
16200 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
16210 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
16220 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
16230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16240 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
16250 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
16260 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
16270 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
16280 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
16290 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
162a0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
162b0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
162c0 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
162d0 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
162e0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
162f0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
16300 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
16310 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
16320 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
16330 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
16340 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
16350 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
16360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
16370 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
16380 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
16390 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
163a0 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
163b0 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
163c0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
163d0 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
163e0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
163f0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16400 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
16410 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
16420 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
16430 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
16440 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16450 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
16460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16470 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
16480 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
16490 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
164a0 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
164b0 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
164c0 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
164d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
164e0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
164f0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20  E_BTREE );.  rc 
16500 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
16510 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
16520 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  uc.pCursor, 0, p
16530 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
16540 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  0, &res);.  if( 
16550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16560 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72    if( res!=0 ) r
16570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16580 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65  RUPT_BKPT;.#ifde
16590 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
165a0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
165b0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
165c0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
165d0 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  to = 0;.  p->cac
165e0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
165f0 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e  _STALE;.  return
16600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16610 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68  *.** Something h
16620 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20  as moved cursor 
16630 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65  "p" out of place
16640 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77  .  Maybe the row
16650 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74   it was.** point
16660 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65  ed to was delete
16670 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
16680 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74   it.  Or maybe t
16690 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20  he btree was.** 
166a0 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61  rebalanced.  Wha
166b0 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c  tever the cause,
166c0 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20   try to restore 
166d0 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65  "p" to the place
166e0 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73   it.** is suppos
166f0 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e  ed to be pointin
16700 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77  g.  If the row w
16710 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
16720 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a  rom under the.**
16730 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65   cursor, set the
16740 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
16750 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a   to a NULL row..
16760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
16770 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
16780 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
16790 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
167a0 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e    int isDifferen
167b0 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65  tRow, rc;.  asse
167c0 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
167d0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
167e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75  ;.  assert( p->u
167f0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
16800 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16810 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
16820 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
16830 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  or) );.  rc = sq
16840 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16850 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43  Restore(p->uc.pC
16860 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72  ursor, &isDiffer
16870 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61  entRow);.  p->ca
16880 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16890 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69  E_STALE;.  if( i
168a0 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20  sDifferentRow ) 
168b0 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
168c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
168d0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65  /*.** Check to e
168e0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
168f0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
16900 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
16910 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62  sor.** if need b
16920 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49  e.  Return any I
16930 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  /O error from th
16940 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74  e restore operat
16950 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
16960 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
16970 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20  tore(VdbeCursor 
16980 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
16990 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
169a0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69  YPE_BTREE );.  i
169b0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
169c0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
169d0 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a  >uc.pCursor) ){.
169e0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
169f0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
16a00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16a10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16a20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16a30 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
16a40 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
16a50 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
16a60 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
16a70 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
16a80 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
16a90 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
16aa0 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
16ab0 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
16ac0 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
16ad0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
16ae0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
16af0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
16b00 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
16b10 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
16b20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
16b30 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
16b40 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
16b50 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
16b60 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
16b70 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
16b80 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
16b90 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
16ba0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
16bb0 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
16bc0 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
16bd0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
16be0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
16bf0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
16c00 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
16c10 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
16c20 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
16c30 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
16c40 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
16c50 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
16c60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16c70 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
16c80 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
16c90 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
16ca0 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54  {.  if( p->eCurT
16cb0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
16cc0 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  EE ){.    if( p-
16cd0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
16ce0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16cf0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
16d00 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20  veto(p);.    }. 
16d10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
16d20 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
16d30 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
16d40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16d50 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
16d60 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  or(p);.    }.  }
16d70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16d80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
16d90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
16da0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
16db0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16dc0 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
16dd0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
16de0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
16df0 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
16e00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16e10 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
16e20 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16e30 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
16e40 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
16e50 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
16e60 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
16e70 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
16e80 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
16e90 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
16ea0 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
16eb0 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
16ec0 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
16ed0 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
16ee0 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
16ef0 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
16f00 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
16f10 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
16f20 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
16f30 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
16f40 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
16f50 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
16f60 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
16f70 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
16f80 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
16f90 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
16fa0 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
16fb0 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
16fc0 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
16fd0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16fe0 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
16ff0 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
17000 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
17010 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
17020 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
17030 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
17040 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
17050 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
17060 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
17070 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
17080 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
17090 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
170a0 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
170b0 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
170c0 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
170d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
170e0 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
170f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
17100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17110 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17120 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
17150 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
17180 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17190 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
171a0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
171b0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
171c0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
171f0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17200 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
17220 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17230 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17240 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
17250 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
17260 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17270 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
172a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
172b0 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
172d0 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
172e0 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
17310 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
17320 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
17350 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
17360 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
17390 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
173a0 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
173b0 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
173c0 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
173d0 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
173e0 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
173f0 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
17400 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
17410 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
17420 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
17430 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
17440 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
17450 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
17460 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
17470 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
17480 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
17490 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
174a0 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
174b0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
174c0 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
174d0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
174e0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
174f0 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
17500 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
17510 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
17520 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
17530 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
17540 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
17550 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
17560 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
17570 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
17580 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
17590 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
175a0 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
175b0 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
175c0 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
175d0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
175e0 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
175f0 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
17600 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
17610 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
17620 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
17630 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
17640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
17650 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
17660 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
17670 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
17680 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
17690 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
176a0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
176b0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
176c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
176d0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
176e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
176f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17700 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
17710 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
17720 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
17730 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
17740 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
17750 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
17760 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
17770 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
17780 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
17790 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
177a0 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
177b0 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
177c0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
177d0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
177e0 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
177f0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
17800 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
17810 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
17820 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
17830 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
17840 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
17850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
17860 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
17870 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
17880 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
17890 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
178a0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
178b0 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
178c0 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
178d0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
178e0 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
178f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
17900 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
17910 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
17920 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
17930 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
17940 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
17950 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
17960 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
17970 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
17980 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
17990 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
179a0 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
179b0 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
179c0 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
179d0 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
179e0 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
179f0 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
17a00 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
17a10 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
17a20 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
17a30 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
17a40 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
17a50 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
17a60 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
17a70 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
17a80 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
17a90 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
17aa0 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
17ab0 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
17ac0 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
17ad0 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
17ae0 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
17af0 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
17b00 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
17b10 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
17b20 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
17b30 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
17b40 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
17b50 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
17b60 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
17b70 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
17b80 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
17b90 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
17ba0 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
17bb0 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
17bc0 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
17bd0 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
17be0 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
17bf0 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
17c00 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
17c10 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
17c20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
17c30 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
17c40 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
17c50 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
17c60 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
17c70 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17c80 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
17c90 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
17ca0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
17cb0 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
17cc0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
17cd0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
17ce0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
17cf0 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
17d00 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
17d10 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
17d20 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
17d30 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
17d40 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
17d50 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
17d60 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
17d70 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
17d80 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
17d90 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
17da0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
17db0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
17dc0 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
17dd0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
17de0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
17df0 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
17e00 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
17e10 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
17e20 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
17e30 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
17e40 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
17e50 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
17e60 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
17e70 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
17e80 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
17e90 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
17ea0 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
17eb0 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
17ec0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
17ed0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
17ee0 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
17ef0 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
17f00 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
17f10 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
17f20 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
17f30 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
17f40 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
17f50 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
17f60 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
17f70 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
17f80 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
17f90 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
17fa0 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
17fb0 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
17fc0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
17fd0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
17fe0 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
17ff0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
18000 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
18010 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
18020 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
18030 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
18040 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
18050 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
18060 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
18070 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
18080 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
18090 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
180a0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
180b0 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
180c0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
180d0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
180e0 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
180f0 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
18100 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
18110 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
18120 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
18130 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
18140 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
18150 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
18160 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
18170 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
18180 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
18190 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
181a0 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
181b0 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
181c0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
181d0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
181e0 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
181f0 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
18200 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
18210 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
18220 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
18230 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
18240 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
18250 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
18260 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
18270 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
18280 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
18290 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
182a0 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
182b0 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
182c0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
182d0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
182e0 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
182f0 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
18300 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
18310 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
18320 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
18330 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
18340 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
18350 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
18360 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
18370 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
18380 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
18390 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
183a0 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
183b0 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
183c0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
183d0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
183e0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
183f0 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
18400 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
18410 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
18420 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
18430 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
18440 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
18450 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
18460 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
18470 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
18480 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
18490 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
184a0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
184b0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
184c0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
184d0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
184e0 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
184f0 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
18500 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
18510 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
18520 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
18530 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
18540 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
18550 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
18560 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
18570 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
18580 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
18590 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
185a0 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
185b0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
185c0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
185d0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
185e0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
185f0 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
18600 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
18610 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
18620 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
18630 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
18640 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18650 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
18660 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
18670 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
18680 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
18690 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
186a0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
186b0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
186c0 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
186d0 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
186e0 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
186f0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
18700 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
18710 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
18720 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
18730 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
18740 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
18750 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
18760 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
18770 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
18780 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
18790 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
187a0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
187b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
187c0 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
187d0 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
187e0 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
187f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18800 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
18810 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
18820 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
18830 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
18840 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
18850 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
18860 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
18870 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
18880 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
18890 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
188a0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
188b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
188c0 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
188d0 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
188e0 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
188f0 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
18900 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
18910 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
18920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18930 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
18940 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
18950 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
18960 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18970 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
18980 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
18990 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
189a0 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
189b0 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
189c0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
189d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
189e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
189f0 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
18a00 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
18a10 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
18a20 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
18a30 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
18a40 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
18a50 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
18a60 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
18a70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18a80 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
18a90 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
18aa0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
18ab0 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
18ac0 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
18ad0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
18ae0 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
18af0 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
18b00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
18b10 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
18b20 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
18b30 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
18b40 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
18b50 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
18b60 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
18b70 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
18b80 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
18b90 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
18ba0 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
18bb0 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
18bc0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
18bd0 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
18be0 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
18bf0 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
18c00 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
18c10 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
18c20 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
18c30 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
18c40 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
18c50 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
18c60 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
18c70 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23  2]<<8)|(x)[3]).#
18c80 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
18c90 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31  _INT(x) (1677721
18ca0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
18cb0 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
18cc0 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
18cd0 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
18ce0 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
18cf0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
18d00 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
18d10 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
18d20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
18d30 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
18d40 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18d50 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
18d60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18d70 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
18d80 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72  ted as two separ
18d90 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ate routines for
18da0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
18db0 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74   The few cases t
18dc0 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61  hat require loca
18dd0 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
18de0 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
18df0 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f  a separate.** ro
18e00 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e  utine so that in
18e10 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20   most cases the 
18e20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69  overhead of movi
18e30 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69  ng the stack poi
18e40 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64  nter.** is avoid
18e50 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75  ed..*/ .static u
18e60 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  32 SQLITE_NOINLI
18e70 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20  NE serialGet(.  
18e80 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
18e90 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
18ea0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
18eb0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
18ec0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
18ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
18ee0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
18ef0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
18f00 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
18f30 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
18f40 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
18f50 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
18f60 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20  T(buf);.  u32 y 
18f70 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
18f80 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28  (buf+4);.  x = (
18f90 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66  x<<32) + y;.  if
18fa0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
18fb0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
18fc0 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d  NCE-OF: R-29851-
18fd0 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61  52272 Value is a
18fe0 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62   big-endian 64-b
18ff0 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  it.    ** twos-c
19000 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19010 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  r. */.    pMem->
19020 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
19030 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
19040 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19050 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
19060 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
19070 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
19080 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39  E-OF: R-57343-49
19090 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  114 Value is a b
190a0 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37  ig-endian IEEE 7
190b0 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20  54-2008 64-bit. 
190c0 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
190d0 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  oint number. */.
190e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
190f0 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
19100 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
19110 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
19120 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
19130 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
19140 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
19150 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
19160 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
19170 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
19180 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
19190 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
191a0 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  is.    ** define
191b0 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
191c0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
191d0 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
191e0 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69  ixed.    ** endi
191f0 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  an..    */.    s
19200 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
19210 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
19220 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
19230 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
19240 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
19250 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
19260 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
19270 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
19280 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19290 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
192a0 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
192b0 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
192c0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
192d0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
192e0 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
192f0 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b  pMem->u.r)==8 );
19300 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19310 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
19320 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
19330 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  u.r, &x, sizeof(
19340 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  x));.    pMem->f
19350 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
19360 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f  NaN(pMem->u.r) ?
19370 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
19380 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
19390 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
193a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
193b0 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
193c0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
193d0 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
193e0 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
193f0 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
19400 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
19410 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
19420 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
19430 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
19460 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
19470 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
19480 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
19490 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
194a0 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
194b0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
194c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
194d0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
194e0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
194f0 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
19500 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
19510 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19520 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
19530 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
19540 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
19550 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
19560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19570 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
19580 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19590 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
195a0 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
195b0 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
195c0 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
195d0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
195e0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
195f0 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19600 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19610 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19620 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19630 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19640 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19650 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
19660 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
19670 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19680 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19690 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
196a0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
196b0 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
196c0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
196d0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
196e0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
196f0 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
19700 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19710 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19720 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19730 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19740 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19750 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
19760 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
19770 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19780 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19790 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
197a0 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
197b0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
197c0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
197d0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
197e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
197f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
19800 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19810 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19820 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19840 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19850 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
19860 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
19870 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
19880 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19890 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
198a0 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
198b0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
198c0 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
198d0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
198e0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
198f0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19900 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
19910 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20  NT(buf);.#ifdef 
19920 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f  __HP_cc .      /
19930 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  * Work around a 
19940 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62  sign-extension b
19950 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d  ug in the HP com
19960 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20  piler for HP/UX 
19970 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  */.      if( buf
19980 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d  [0]&0x80 ) pMem-
19990 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66  >u.i |= 0xffffff
199a0 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65  ff80000000LL;.#e
199b0 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ndif.      pMem-
199c0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
199d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
199e0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
199f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
19a00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19a10 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
19a20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19a30 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19a40 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
19a50 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
19a60 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
19a70 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19a80 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19a90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19aa0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
19ab0 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
19ac0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
19ad0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
19ae0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19af0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b10 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19b20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
19b30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
19b40 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
19b50 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19b60 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
19b70 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
19b80 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
19b90 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
19ba0 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
19bb0 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
19bc0 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
19bd0 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
19be0 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
19bf0 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
19c00 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
19c10 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
19c20 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
19c30 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
19c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
19c50 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
19c60 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
19c70 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
19c80 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
19c90 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19ca0 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
19cb0 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
19cc0 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
19cd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
19ce0 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
19cf0 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
19d00 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19d10 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
19d20 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
19d30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19d40 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
19d50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
19d60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
19d70 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19d80 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
19d90 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
19da0 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
19db0 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
19dc0 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
19dd0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19de0 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
19df0 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
19e00 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
19e10 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
19e20 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
19e30 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
19e40 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
19e50 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
19e60 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
19e70 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
19e80 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
19e90 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
19ea0 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
19eb0 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
19ec0 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
19ed0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
19ee0 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
19ef0 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
19f00 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
19f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19f30 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
19f40 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
19f50 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
19f60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
19f70 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
19f80 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
19f90 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
19fa0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
19fb0 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
19fc0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
19fd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
19fe0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
19ff0 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
1a000 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
1a010 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
1a020 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
1a030 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
1a040 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
1a050 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
1a060 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
1a070 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
1a080 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
1a090 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
1a0a0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
1a0b0 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
1a0c0 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
1a0d0 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
1a0e0 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
1a0f0 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
1a100 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1a110 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
1a120 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
1a130 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
1a140 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
1a150 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
1a160 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
1a170 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
1a180 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1a190 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
1a1a0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
1a1b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
1a1c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
1a1d0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1a1e0 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
1a1f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a210 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1a220 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
1a230 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
1a260 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
1a270 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
1a2a0 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
1a2b0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
1a2c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a2d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
1a2e0 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
1a2f0 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
1a300 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1a310 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1a320 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1a330 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1a340 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
1a370 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
1a380 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
1a390 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a3c0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1a3d0 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
1a3e0 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
1a3f0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
1a400 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
1a410 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
1a420 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
1a430 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
1a440 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
1a450 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
1a460 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
1a470 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
1a480 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
1a490 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
1a4a0 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
1a4b0 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
1a4c0 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
1a4d0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
1a4e0 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
1a4f0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
1a500 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1a510 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1a520 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
1a530 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
1a540 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
1a550 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
1a560 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1a570 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1a580 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1a590 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
1a5a0 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
1a5b0 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
1a5c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
1a5d0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
1a5e0 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
1a5f0 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
1a600 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
1a610 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
1a620 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
1a630 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
1a640 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
1a650 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1a660 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1a670 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
1a680 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1a690 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
1a6a0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1a6b0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1a6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1a6d0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1a6e0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1a6f0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1a700 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1a710 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1a720 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1a730 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1a740 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1a750 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1a760 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1a770 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1a780 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1a790 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1a7a0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1a7b0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1a7c0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1a7d0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1a7e0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1a7f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1a800 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1a810 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1a820 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1a830 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1a840 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1a850 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1a860 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1a870 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1a880 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1a890 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1a8a0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1a8b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a8c0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
1a8d0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1a900 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1a910 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1a920 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a940 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1a950 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1a960 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1a970 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1a980 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1a990 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1a9a0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1a9b0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1a9c0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1a9d0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1a9e0 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1a9f0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1aa00 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
1aa10 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
1aa20 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
1aa30 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1aa40 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
1aa50 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
1aa60 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
1aa70 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
1aa80 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
1aa90 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
1aaa0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
1aab0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
1aac0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
1aad0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
1aae0 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1aaf0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
1ab00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1ab10 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1ab20 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1ab30 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1ab40 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1ab50 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1ab60 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1ab70 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
1ab80 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
1ab90 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
1aba0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1abb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1abc0 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
1abd0 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
1abe0 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
1abf0 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
1ac00 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
1ac10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1ac20 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
1ac30 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
1ac40 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
1ac50 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1ac60 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
1ac70 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
1ac80 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
1ac90 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
1aca0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1acb0 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
1acc0 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
1acd0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1ace0 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
1acf0 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
1ad00 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
1ad10 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1ad20 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
1ad30 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
1ad40 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
1ad50 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1ad60 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
1ad70 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
1ad80 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1ad90 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
1ada0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1adb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
1adc0 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
1add0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1ade0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1adf0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1ae00 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1ae10 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1ae20 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1ae30 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ae40 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1ae50 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
1ae60 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
1ae70 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
1ae80 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
1ae90 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
1aea0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1aeb0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1aec0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
1aed0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1aee0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1aef0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1af00 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
1af10 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1af20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1af30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
1af40 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
1af50 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
1af60 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1af70 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1af80 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1af90 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1afa0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1afb0 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
1afc0 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
1afd0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1afe0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1aff0 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1b000 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
1b010 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1b020 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1b030 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
1b040 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
1b050 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
1b060 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
1b070 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
1b080 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
1b090 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1b0a0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1b0b0 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1b0c0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
1b0d0 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
1b0e0 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
1b0f0 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
1b100 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
1b110 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
1b120 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
1b130 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
1b140 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
1b150 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
1b160 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
1b170 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
1b180 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
1b190 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
1b1a0 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
1b1b0 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
1b1c0 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
1b1d0 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
1b1e0 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
1b1f0 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
1b200 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
1b210 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
1b220 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
1b230 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
1b240 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
1b250 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
1b260 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
1b270 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
1b280 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1b290 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
1b2a0 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
1b2b0 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
1b2c0 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
1b2d0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
1b2e0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1b2f0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1b300 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
1b310 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
1b320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
1b330 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1b340 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1b350 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1b360 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1b370 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
1b380 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1b390 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b3a0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1b3b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b3c0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1b3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1b3e0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1b3f0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1b400 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1b410 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
1b420 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
1b430 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
1b440 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
1b450 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
1b460 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
1b470 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
1b480 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
1b490 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
1b4a0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
1b4b0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
1b4c0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
1b4d0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1b4e0 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1b4f0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1b500 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1b510 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1b520 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1b530 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1b540 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1b550 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1b560 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1b570 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1b580 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1b590 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1b5a0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1b5b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b5c0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1b5d0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1b5e0 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
1b5f0 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
1b600 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1b610 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b620 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1b630 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
1b640 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
1b650 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1b660 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1b670 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
1b680 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
1b690 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1b6a0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1b6b0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1b6c0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
1b6d0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
1b6e0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
1b6f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b700 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
1b710 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
1b720 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
1b730 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
1b740 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1b750 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1b760 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1b770 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1b780 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1b790 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b7a0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1b7b0 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1b7c0 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1b7d0 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1b7e0 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1b7f0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1b800 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1b810 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1b820 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1b830 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1b840 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1b850 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1b860 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1b870 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1b880 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1b890 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1b8a0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1b8b0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1b8c0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1b8d0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1b8e0 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1b8f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1b900 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1b910 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1b920 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1b930 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1b940 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1b950 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1b960 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1b970 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1b980 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1b990 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1b9a0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1b9b0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1b9c0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1b9d0 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1b9e0 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1b9f0 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1ba00 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1ba10 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1ba20 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1ba30 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1ba40 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1ba50 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1ba60 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1ba70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1ba80 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1ba90 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1baa0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1bab0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1bac0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1bad0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1bae0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1baf0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1bb00 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1bb10 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1bb20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1bb30 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1bb40 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1bb50 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1bb60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1bb70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1bb80 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1bb90 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1bba0 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46   + pKeyInfo->nXF
1bbb0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
1bbc0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
1bbd0 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
1bbe0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1bbf0 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
1bc00 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1bc10 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
1bc20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1bc30 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
1bc40 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
1bc50 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
1bc60 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
1bc70 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
1bc80 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
1bc90 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
1bca0 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1bcb0 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20  .nXField values 
1bcc0 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
1bcd0 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
1bce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
1bcf0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1bd00 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
1bd10 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
1bd20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1bd30 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
1bd40 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1bd50 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1bd60 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1bd70 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1bd80 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1bd90 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1bda0 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1bdb0 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1bdc0 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1bdd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bde0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1bdf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1be00 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1be10 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1be20 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1be30 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1be40 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1be50 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1be60 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1be70 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1be80 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1be90 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1bea0 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1beb0 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1bec0 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1bed0 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1bee0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1bef0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1bf00 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1bf10 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1bf20 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1bf30 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1bf40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1bf50 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1bf60 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1bf70 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1bf80 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1bf90 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1bfa0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1bfb0 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1bfc0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1bfd0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1bfe0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1bff0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1c000 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1c010 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1c020 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1c030 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1c040 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1c050 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1c060 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1c070 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1c080 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1c090 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1c0a0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1c0b0 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1c0c0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1c0d0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1c100 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1c110 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1c120 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1c130 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1c140 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1c150 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1c160 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1c170 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1c180 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1c190 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1c1a0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1c1b0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1c1c0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1c1d0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1c1e0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1c1f0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1c200 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1c210 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1c220 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
1c230 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1c240 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1c250 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1c260 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1c270 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1c280 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1c290 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1c2a0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1c2b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c2c0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1c2d0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1c2e0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1c2f0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1c300 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1c310 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1c320 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1c330 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1c340 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1c350 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
1c360 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
1c370 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1c380 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1c390 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1c3a0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1c3b0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
1c3c0 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
1c3d0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
1c3e0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
1c3f0 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
1c400 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c410 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1c420 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c430 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1c440 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
1c450 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
1c460 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1c470 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
1c480 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1c490 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
1c4a0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
1c4b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1c4c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1c4d0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
1c4e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1c4f0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1c500 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
1c510 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
1c520 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
1c530 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
1c540 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
1c550 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
1c560 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  lessor..*/.stati
1c570 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1c580 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
1c590 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
1c5a0 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
1c5b0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
1c5c0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1c5d0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e  z, pB2->z, pB1->
1c5e0 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e  n>pB2->n ? pB2->
1c5f0 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69  n : pB1->n);.  i
1c600 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1c610 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e  .  return pB1->n
1c620 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a   - pB2->n;.}../*
1c630 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  .** Do a compari
1c640 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34  son between a 64
1c650 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1c660 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74  ger and a 64-bit
1c670 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a   floating-point.
1c680 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ** number.  Retu
1c690 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1c6a0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1c6b0 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34  f the first (i64
1c6c0 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a  ) is less than,.
1c6d0 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
1c6e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1c6f0 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29   second (double)
1c700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c710 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1c720 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f  ompare(i64 i, do
1c730 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73  uble r){.  if( s
1c740 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45  izeof(LONGDOUBLE
1c750 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20  _TYPE)>8 ){.    
1c760 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
1c770 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  x = (LONGDOUBLE_
1c780 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20  TYPE)i;.    if( 
1c790 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  x<r ) return -1;
1c7a0 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72  .    if( x>r ) r
1c7b0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1c7c0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
1c7d0 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20  .    i64 y;.    
1c7e0 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66  double s;.    if
1c7f0 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38  ( r<-92233720368
1c800 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1c810 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20  urn +1;.    if( 
1c820 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37  r>92233720368547
1c830 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e  75807.0 ) return
1c840 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1c850 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1c860 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1c870 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20    if( i>y ){.   
1c880 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45     if( y==SMALLE
1c890 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e  ST_INT64 && r>0.
1c8a0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1c8b0 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a       return +1;.
1c8c0 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64      }.    s = (d
1c8d0 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28  ouble)i;.    if(
1c8e0 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   s<r ) return -1
1c8f0 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20  ;.    if( s>r ) 
1c900 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1c910 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
1c920 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1c930 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
1c940 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
1c950 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1c960 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1c970 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1c980 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1c990 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1c9a0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1c9b0 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1c9c0 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1c9d0 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1c9e0 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1c9f0 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1ca00 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1ca10 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1ca20 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1ca30 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1ca40 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1ca50 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1ca60 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1ca70 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1ca80 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1ca90 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1caa0 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1cab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1cac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1cad0 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1cae0 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1caf0 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1cb00 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1cb10 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1cb20 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1cb30 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1cb40 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1cb50 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1cb60 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1cb70 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1cb80 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1cb90 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1cba0 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1cbb0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1cbc0 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1cbd0 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1cbe0 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1cbf0 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1cc00 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1cc10 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1cc20 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1cc30 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1cc40 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1cc50 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1cc60 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65   /* At least one
1cc70 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   of the two valu
1cc80 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20  es is a number. 
1cc90 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1cca0 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1ccb0 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1ccc0 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1ccd0 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1cce0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1ccf0 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1cd00 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1cd10 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1cd20 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1cd30 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  i ) return +1;. 
1cd40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1cd50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1cd60 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c   & f2 & MEM_Real
1cd70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1cd80 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70  ( pMem1->u.r < p
1cd90 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1cda0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1cdb0 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d   pMem1->u.r > pM
1cdc0 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1cdd0 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1cde0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1cdf0 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29  if( (f1&MEM_Int)
1ce00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1ce10 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
1ce20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1ce30 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  urn sqlite3IntFl
1ce40 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  oatCompare(pMem1
1ce50 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e  ->u.i, pMem2->u.
1ce60 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1ce70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ce80 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1ce90 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1cea0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1ceb0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1cec0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1ced0 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74     return -sqlit
1cee0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1cef0 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d  e(pMem2->u.i, pM
1cf00 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em1->u.r);.     
1cf10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cf20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1cf30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
1cf40 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f  urn +1;.  }..  /
1cf50 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1cf60 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1cf70 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1cf80 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1cf90 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1cfa0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1cfb0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1cfc0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1cfd0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1cfe0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1cff0 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1d000 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1d010 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1d020 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1d030 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1d040 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1d050 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1d060 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1d070 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1d080 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1d090 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1d0a0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1d0b0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1d0c0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d0d0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1d0e0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d0f0 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1d100 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1d110 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1d120 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1d130 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1d140 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1d150 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1d160 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1d170 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1d180 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1d190 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1d1a0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1d1b0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1d1c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1d1d0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1d1e0 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1d1f0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1d200 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1d210 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1d220 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1d230 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1d240 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1d250 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1d260 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1d270 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1d280 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1d290 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1d2a0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1d2b0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1d2c0 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1d2d0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1d2e0 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1d2f0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1d300 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1d310 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1d320 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1d330 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1d340 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1d350 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1d360 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1d370 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1d380 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1d390 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1d3a0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1d3b0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1d3c0 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1d3d0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1d3e0 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1d3f0 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1d400 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1d410 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1d420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1d430 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1d440 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1d450 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1d460 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1d470 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1d480 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1d490 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1d4a0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1d4b0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1d4c0 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1d4d0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1d4e0 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1d4f0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1d500 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1d510 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1d520 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1d530 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d540 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1d550 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1d560 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1d570 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d580 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d590 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1d5a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1d5b0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1d5c0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d5d0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d5e0 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1d5f0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d600 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1d610 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d620 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d630 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1d640 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1d650 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d660 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1d670 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1d680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d690 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d6a0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1d6b0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1d6c0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1d6d0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1d6e0 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1d6f0 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1d700 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1d710 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d730 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d740 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1d750 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1d760 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1d770 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1d780 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1d790 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1d7a0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1d7b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d7c0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1d7d0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1d7e0 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1d7f0 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1d800 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1d810 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1d820 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1d830 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1d840 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1d850 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1d860 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1d870 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1d880 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1d890 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1d8a0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1d8b0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1d8c0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1d8d0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1d8e0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1d8f0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1d900 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1d910 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1d920 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1d930 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1d940 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1d950 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1d960 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1d970 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1d980 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1d990 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1d9a0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1d9b0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1d9c0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1d9d0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1d9e0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1d9f0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1da00 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1da10 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1da20 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1da30 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1da40 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1da50 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1da60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1da70 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1da80 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1da90 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1daa0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1dab0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1dac0 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1dad0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1dae0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1daf0 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1db00 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1db10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1db20 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1db30 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1db40 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1db50 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1db60 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1db70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1db80 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1db90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1dba0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1dbb0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1dbc0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1dbd0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1dbe0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1dbf0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1dc00 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1dc10 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1dc30 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1dc40 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1dc50 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1dc80 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1dc90 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1dca0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1dcd0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1dce0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1dcf0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dd10 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1dd20 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1dd30 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1dd60 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1dd70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1dd80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1dda0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1ddb0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1ddc0 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1ddd0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1dde0 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1ddf0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1de00 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1de10 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1de20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1de30 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1de40 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1de50 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1de60 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1de70 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1de80 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1de90 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1dea0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1deb0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1dec0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1ded0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1dee0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1def0 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1df00 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1df10 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1df20 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1df30 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1df40 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1df50 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1df60 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1df70 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1df80 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1df90 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1dfa0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1dfb0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1dfc0 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1dfd0 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1dfe0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1dff0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1e000 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1e010 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1e020 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1e030 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1e040 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1e050 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e060 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e070 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1e080 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1e090 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1e0a0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1e0b0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1e0c0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1e0d0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1e0e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e0f0 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1e100 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e110 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1e120 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1e130 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1e140 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1e150 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1e160 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1e170 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1e180 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1e190 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1e1a0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1e1b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1e1c0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1e1d0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1e1e0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1e1f0 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1e200 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1e210 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1e220 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1e230 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1e240 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1e250 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1e260 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1e270 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1e280 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1e290 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e2a0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1e2b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1e2d0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e2e0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e2f0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1e300 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1e310 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1e320 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1e330 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1e340 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
1e350 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
1e360 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
1e370 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e380 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1e390 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1e3a0 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1e3b0 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1e3c0 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1e3d0 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1e3e0 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1e3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e400 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1e410 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1e420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e430 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1e440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e450 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1e460 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1e470 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e480 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1e490 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1e4a0 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1e4b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1e4c0 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1e4d0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1e4e0 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1e4f0 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1e500 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1e510 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1e520 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1e530 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1e540 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1e550 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1e560 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1e570 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1e580 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1e590 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1e5a0 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1e5b0 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1e5c0 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1e5d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1e5e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e5f0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e600 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e610 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1e620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e630 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e640 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1e650 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1e660 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1e670 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1e680 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1e690 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
1e6a0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1e6b0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e6c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1e6d0 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
1e6e0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1e6f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1e700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e710 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1e720 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
1e730 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
1e740 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
1e750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e760 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e770 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1e780 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1e790 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1e7a0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1e7b0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1e7c0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1e7d0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1e7e0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1e7f0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1e800 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e810 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1e820 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e830 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1e840 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1e850 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1e860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e870 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1e880 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1e890 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1e8a0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1e8b0 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1e8c0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1e8d0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1e8e0 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1e8f0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1e900 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1e910 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1e920 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1e930 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1e940 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1e950 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e960 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e970 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e980 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1e990 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1e9a0 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1e9b0 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1e9c0 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1e9d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1e9e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1e9f0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1ea00 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1ea10 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1ea20 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1ea30 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1ea40 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1ea50 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1ea60 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1ea70 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1ea80 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1ea90 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1eaa0 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1eab0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1eac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ead0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1eae0 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1eaf0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1eb00 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1eb10 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1eb20 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1eb30 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1eb40 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1eb50 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1eb60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1eb70 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1eb80 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1eb90 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1eba0 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1ebb0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1ebc0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1ebd0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1ebe0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1ebf0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1ec00 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1ec10 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
1ec20 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1ec30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1ec40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ec50 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
1ec60 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1ec70 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1ec80 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ec90 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
1eca0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1ecb0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ecc0 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
1ecd0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ece0 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
1ecf0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1ed00 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1ed10 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1ed20 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1ed30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ed40 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed60 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1ed70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ed80 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1ed90 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1eda0 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1edb0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1edc0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1edd0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1ede0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1edf0 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1ee00 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1ee10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ee20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1ee30 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1ee40 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1ee50 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1ee60 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1ee70 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1ee80 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1ee90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1eea0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1eeb0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1eec0 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1eed0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1eee0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1eef0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1ef00 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
1ef10 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ef20 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1ef30 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1ef40 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1ef50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ef60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1ef70 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1ef80 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1ef90 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1efa0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1efb0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1efc0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1efd0 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1efe0 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1eff0 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1f000 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1f010 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1f020 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1f030 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1f040 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1f050 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1f060 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1f070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1f080 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1f090 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1f0a0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1f0b0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1f0c0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1f0d0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1f0e0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1f0f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1f100 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1f110 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1f120 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1f130 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1f140 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1f150 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1f160 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1f170 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1f180 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1f190 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1f1a0 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1f1b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
1f1c0 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
1f1d0 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
1f1e0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1f1f0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f200 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f210 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
1f220 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1f230 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
1f240 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
1f250 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
1f260 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f270 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1f280 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f290 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1f2a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1f2b0 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1f2c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1f2d0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1f2e0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1f2f0 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1f300 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f310 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1f320 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1f330 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
1f340 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f350 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1f360 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1f370 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f380 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1f390 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1f3a0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1f3b0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1f3c0 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
1f3d0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1f3e0 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
1f3f0 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1f400 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1f410 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
1f420 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
1f430 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
1f440 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
1f450 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
1f460 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
1f470 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
1f480 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
1f490 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
1f4a0 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
1f4b0 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
1f4c0 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
1f4d0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1f4e0 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
1f4f0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1f500 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1f510 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1f520 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1f530 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1f540 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1f550 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1f560 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1f570 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1f580 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1f590 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1f5a0 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1f5b0 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1f5c0 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1f5d0 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1f5e0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1f5f0 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1f600 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1f610 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1f620 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1f630 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1f640 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
1f650 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
1f660 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
1f670 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
1f680 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1f690 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1f6a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1f6b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1f6c0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1f6d0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f6e0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f6f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f700 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1f710 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1f720 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f730 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1f740 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f760 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f770 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f780 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1f790 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f7a0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1f7b0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1f7c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f7d0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f7e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f7f0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1f800 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1f810 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f820 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1f830 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1f840 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1f850 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1f860 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f870 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f880 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1f890 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1f8a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f8b0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1f8c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1f8d0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1f8e0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1f8f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f900 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f920 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
1f930 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1f940 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f950 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
1f960 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1f970 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1f980 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1f990 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
1f9a0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
1f9b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1f9c0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1f9d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f9e0 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
1f9f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
1fa00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
1fa10 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
1fa20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1fa30 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
1fa40 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
1fa50 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
1fa60 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
1fa70 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
1fa80 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
1fa90 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
1faa0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
1fab0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
1fac0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
1fad0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
1fae0 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
1faf0 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
1fb00 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
1fb10 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
1fb20 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
1fb30 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
1fb40 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
1fb50 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
1fb60 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
1fb70 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
1fb80 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
1fb90 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
1fba0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
1fbb0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
1fbc0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
1fbd0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
1fbe0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1fbf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1fc00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fc10 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
1fc20 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1fc30 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1fc40 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1fc50 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
1fc60 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73    }..  if( v>lhs
1fc70 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1fc80 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
1fc90 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
1fca0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1fcb0 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
1fcc0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
1fcd0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
1fce0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1fcf0 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
1fd00 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
1fd10 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
1fd20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
1fd30 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
1fd40 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fd50 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1fd60 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fd70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1fd80 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1fd90 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1fda0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1fdb0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
1fdc0 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
1fdd0 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
1fde0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1fdf0 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
1fe00 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
1fe10 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1fe20 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  c;.    pPKey2->e
1fe30 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  qSeen = 1;.  }..
1fe40 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1fe50 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1fe60 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1fe70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
1fe80 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1fe90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1fea0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1feb0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1fec0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1fed0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1fee0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1fef0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1ff00 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
1ff10 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
1ff20 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
1ff30 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1ff40 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
1ff50 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
1ff60 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1ff70 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
1ff80 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1ff90 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1ffa0 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
1ffb0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1ffc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1ffd0 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
1ffe0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1fff0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
20000 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
20010 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
20020 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
20030 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
20040 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
20050 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
20060 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
20070 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73   int res;..  ass
20080 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  ert( pPKey2->aMe
20090 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[0].flags & MEM
200a0 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73  _Str );.  vdbeAs
200b0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
200c0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
200d0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
200e0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
200f0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20100 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
20110 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
20120 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
20130 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20140 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
20150 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
20160 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
20170 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
20180 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
20190 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
201a0 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
201b0 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
201c0 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
201d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
201e0 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
201f0 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
20200 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
20210 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
20220 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
20230 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
20240 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
20250 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
20260 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
20270 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20280 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
20290 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
202a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
202b0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
202c0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
202d0 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
202e0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
202f0 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
20300 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
20310 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
20320 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
20330 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
20340 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
20350 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20360 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
20370 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
20380 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
20390 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
203a0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
203b0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
203c0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
203d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
203e0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
203f0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
20400 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
20410 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  qSeen = 1;.     
20420 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20430 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
20440 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20450 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
20460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
20470 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
20480 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20490 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
204a0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
204b0 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
204c0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
204d0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
204e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
204f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20500 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20510 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
20520 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
20530 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
20540 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
20550 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20560 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
20570 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
20580 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20590 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
205a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
205b0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
205c0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
205d0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
205e0 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
205f0 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
20600 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
20610 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
20620 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
20630 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
20640 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
20650 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20660 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
20670 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20680 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
20690 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
206a0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
206b0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
206c0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
206d0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
206e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
206f0 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
20700 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20710 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
20720 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
20730 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20740 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
20750 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
20760 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
20770 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
20780 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
20790 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
207a0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
207b0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
207c0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
207d0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
207e0 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
207f0 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
20800 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
20810 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
20820 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
20830 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
20840 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20850 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
20860 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
20870 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
20880 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
20890 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
208a0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
208b0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
208c0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
208d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
208e0 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
208f0 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
20900 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
20910 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
20920 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
20930 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
20940 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
20950 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
20960 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
20970 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
20980 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
20990 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
209a0 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
209b0 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
209c0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
209d0 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
209e0 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
209f0 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
20a00 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
20a10 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
20a20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
20a30 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
20a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a50 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
20a60 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
20a70 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
20a80 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
20a90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20aa0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
20ab0 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
20ac0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
20ad0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
20ae0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20af0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
20b00 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20b10 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
20b20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
20b30 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
20b40 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
20b50 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
20b60 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
20b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
20b80 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
20b90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
20ba0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20bb0 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
20bc0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
20bd0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20be0 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
20bf0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
20c00 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
20c10 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
20c20 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
20c30 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
20c40 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
20c50 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
20c60 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
20c70 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
20c80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20c90 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
20ca0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
20cb0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
20cc0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
20cd0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
20ce0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
20cf0 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
20d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20d10 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
20d20 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
20d30 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
20d40 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
20d50 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
20d60 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
20d70 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
20d80 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
20d90 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
20da0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
20db0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
20dc0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
20dd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20de0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
20df0 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
20e00 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
20e10 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
20e20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
20e30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20e40 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
20e50 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  m, v;..  /* Get 
20e60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20e70 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
20e80 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
20e90 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
20ea0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
20eb0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
20ec0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
20ed0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20ee0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
20ef0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
20f00 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
20f10 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
20f20 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
20f30 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
20f40 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
20f50 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
20f60 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
20f70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20f80 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
20f90 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
20fa0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
20fb0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
20fc0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
20fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
20fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
20ff0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
21000 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
21010 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
21020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
21030 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
21040 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
21050 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
21060 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
21070 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content 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 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
210a0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
210b0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
210c0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
210d0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
210e0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
210f0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21100 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21110 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
21120 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
21130 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
21140 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
21150 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
21160 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
21170 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
21180 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
21190 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
211a0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
211b0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
211c0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
211d0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
211e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
211f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
21200 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
21210 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
21220 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
21230 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
21240 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
21250 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
21260 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
21270 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21280 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
21290 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
212a0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
212b0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
212c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
212d0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
212e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
212f0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
21300 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
21310 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21320 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
21330 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21340 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
21350 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21360 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
21370 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
21380 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
21390 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
213a0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
213b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
213c0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
213d0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
213e0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
213f0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
21400 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69  peSizes[typeRowi
21410 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d];.  testcase( 
21420 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
21430 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
21440 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
21450 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
21460 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
21470 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21480 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
21490 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
214a0 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
214b0 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
214c0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
214d0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
214e0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
214f0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
21500 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
21510 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
21520 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
21530 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
21540 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
21550 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
21560 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
21570 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
21580 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
21590 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
215a0 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
215b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
215c0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
215d0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
215e0 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
215f0 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
21600 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21610 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21630 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
21640 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
21650 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
21660 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
21670 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
21680 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
21690 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
216a0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
216b0 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
216c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
216d0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
216e0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
216f0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
21700 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
21710 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
21720 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
21730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21740 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
21750 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
21760 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
21770 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
21780 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
21790 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
217a0 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
217b0 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
217c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
217d0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
217e0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
217f0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
21800 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
21810 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
21820 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
21830 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
21840 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
21850 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
21860 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21870 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
21880 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
21890 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
218a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
218b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
218c0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
218d0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
218e0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
218f0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
21900 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
21910 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
21920 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
21930 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
21940 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
21950 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
21960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21970 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
21980 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
21990 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
219a0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
219b0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
219c0 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  pCur;.  Mem m;..
219d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
219e0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
219f0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20  BTREE );.  pCur 
21a00 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
21a10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21a20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
21a30 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
21a40 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
21a50 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
21a60 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
21a70 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
21a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
21a90 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
21aa0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
21ab0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
21ac0 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
21ad0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
21ae0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
21af0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
21b00 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
21b10 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
21b20 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
21b30 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
21b40 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
21b50 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
21b60 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
21b70 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
21b80 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
21b90 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
21ba0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21bb0 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
21bc0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21bd0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21be0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21bf0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21c00 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
21c10 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21c20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21c30 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
21c40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21c50 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
21c60 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
21c70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
21c80 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
21c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
21cb0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
21cc0 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
21cd0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
21ce0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
21cf0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
21d00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
21d10 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
21d20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
21d30 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
21d40 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
21d50 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
21d60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21d70 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
21d80 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
21d90 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
21da0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
21db0 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
21dc0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
21dd0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
21de0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
21df0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
21e00 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
21e10 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
21e20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
21e30 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
21e40 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
21e50 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
21e60 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
21e70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
21e80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
21e90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21ea0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
21eb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
21ec0 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
21ed0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
21ee0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
21ef0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
21f00 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
21f10 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
21f20 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
21f30 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
21f40 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
21f50 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
21f60 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
21f70 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
21f80 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
21f90 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
21fa0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
21fb0 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
21fc0 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
21fd0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
21fe0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
21ff0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
22000 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
22010 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
22020 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
22030 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
22040 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
22050 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
22060 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
22070 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
22080 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
22090 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
220a0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
220b0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
220c0 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
220d0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
220e0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
220f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22100 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
22110 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
22120 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
22130 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
22140 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
22150 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
22160 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
22170 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
22180 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
22190 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
221a0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
221b0 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
221c0 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
221d0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
221e0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
221f0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
22200 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
22210 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
22220 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
22230 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
22240 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
22250 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
22260 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
22270 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
22280 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
22290 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
222a0 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
222b0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
222c0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
222d0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
222e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
222f0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
22300 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
22310 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
22320 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
22330 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
22340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22350 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
22360 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
22370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
22380 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
22390 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
223a0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
223b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
223c0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
223d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
223e0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
223f0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
22400 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
22410 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
22420 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
22430 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
22440 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
22450 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
22460 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
22470 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
22480 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
22490 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
224a0 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
224b0 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
224c0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
224d0 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
224e0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
224f0 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
22500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
22510 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
22520 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
22530 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
22540 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22550 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
22560 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
22570 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
22580 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
22590 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
225a0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
225b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
225c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
225d0 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
225e0 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
225f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
22600 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
22610 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
22620 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
22630 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
22640 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
22650 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
22660 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
22670 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
22680 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
22690 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
226a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
226b0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
226c0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
226d0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
226e0 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
226f0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
22700 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22710 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22720 4c 45 20 2a 2f 0a                                LE */.