/ Hex Artifact Content
Login

Artifact a5d98e1d6443d96666af8134b35c72a6c7262b96:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e    return p ? p->
0740: 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zSql : 0;.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
08e0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08f0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0900: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0910: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0920: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0930: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0940: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0950: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0960: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
0970: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
0980: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
0990: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09b0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09c0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09e0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a00: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a10: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a20: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a30: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a50: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a60: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0ac0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0ad0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0ae0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0af0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b00: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b10: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b20: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b40: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b50: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b60: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0b70: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0b80: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0b90: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0ba0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0bb0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bc0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0bd0: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0be0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0bf0: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c00: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c10: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c20: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c30: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c40: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c50: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c60: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0c70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c80: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0c90: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0ca0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0cb0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cc0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0cd0: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0ce0: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d10: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d20: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d40: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d50: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d60: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0d70: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d80: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0d90: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0da0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0db0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0dc0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0dd0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0de0: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0df0: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e00: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e20: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e30: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e50: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0e70: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0e80: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0e90: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0eb0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0ed0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0ee0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0ef0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f00: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f10: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f20: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f30: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f40: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f50: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f60: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0f70: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0f80: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0f90: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fa0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fb0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0fc0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
0fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0fe0: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
0ff0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1000: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1010: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1020: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1030: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1040: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1050: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1060: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1070: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1080: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1090: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10c0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
10d0: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
10e0: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
10f0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1100: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1110: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1120: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1130: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1150: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1160: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1170: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1180: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73  perand..*/.int s
1190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
11b0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
11c0: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74  , int p3){.  int
11d0: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
11e0: 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70  p;..  i = p->nOp
11f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1200: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1210: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1220: 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78  t( op>0 && op<0x
1230: 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ff );.  if( p->p
1240: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  Parse->nOpAlloc<
1250: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
1260: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20  owOpArray(p, 1) 
1270: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1280: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
1290: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
12a0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
12b0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
12c0: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
12d0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
12e0: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
12f0: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1300: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1310: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
1320: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1330: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1340: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1350: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1360: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
1370: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1380: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
13b0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
13c0: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
13d0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
13e0: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
13f0: 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e  k=0; jj<SQLITE_N
1400: 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29  _COLCACHE; jj++)
1410: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
1420: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1430: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1440: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  + jj;.      if( 
1450: 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  x->iLevel>pParse
1460: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c  ->iCacheLevel ||
1470: 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f   x->iReg==0 ) co
1480: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72  ntinue;.      pr
1490: 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64  intf(" r[%d]={%d
14a0: 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20  :%d}", x->iReg, 
14b0: 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43  x->iTable, x->iC
14c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b  olumn);.      kk
14d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
14e0: 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c  ( kk ) printf("\
14f0: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1500: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1510: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1520: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1530: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1540: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1550: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1560: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1570: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1580: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1590: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
15a0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
15b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
15c0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
15d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
15e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
15f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1600: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1610: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1620: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1630: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1640: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1650: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1660: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1670: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1680: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1690: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
16a0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
16b0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
16c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
16e0: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
16f0: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1700: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1710: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1720: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1740: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1750: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1760: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1770: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
17a0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
17b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
17c0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
17d0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
17e0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
17f0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1810: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1820: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1830: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1840: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1850: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1860: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1870: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1880: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1890: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
18a0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
18b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18c0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
18d0: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
18e0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
18f0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1900: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1910: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 77 69   the p4 value wi
1920: 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20 74 79  th a P4_INT64 ty
1930: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1940: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1950: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1960: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1970: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1980: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19a0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
19b0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19d0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
19e0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
19f0: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1a00: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1a10: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1a20: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1a30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
1a40: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
1a50: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
1a60: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
1a70: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
1a80: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
1a90: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
1aa0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1ab0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
1ac0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
1ad0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
1ae0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
1af0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1b00: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
1b10: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
1b20: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1b40: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1b50: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1b60: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1b70: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1b80: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1b90: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1ba0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1bb0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1bc0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1bd0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1be0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1bf0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1c00: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1c10: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1c30: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1c40: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1c50: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1c70: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1c80: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1c90: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1ca0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1cb0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1cc0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1cd0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1ce0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1cf0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1d00: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1d10: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1d20: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1d30: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1d40: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1d50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1d60: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1d70: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1d80: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1d90: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1da0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1db0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1dc0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1dd0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1de0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e00: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1e10: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e30: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1e40: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1e50: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1e60: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e80: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1e90: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1ec0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ed0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1ef0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1f00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1f10: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1f20: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1f30: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1f40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1f60: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1f70: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1f80: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1f90: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1fa0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1fb0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1fc0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1fd0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1fe0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1ff0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2000: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2010: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2020: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2030: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2040: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2050: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2060: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2070: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2080: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
2090: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
20a0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
20b0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
20c0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
20d0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
20e0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
20f0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2100: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2110: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2120: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2130: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2140: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2150: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2160: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2170: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2180: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
2190: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
21a0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
21b0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
21c0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
21d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
21e0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
21f0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2200: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2210: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
2220: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2230: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2240: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
2250: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
2260: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
2270: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2280: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
2290: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
22d0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
22e0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
22f0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
2300: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
2310: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
2320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2330: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2340: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2350: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2360: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2370: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2380: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2390: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
23a0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
23b0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
23c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
23d0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
23e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
23f0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2400: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2410: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2420: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2430: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2440: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2460: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2470: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2480: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2490: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
24a0: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
24b0: 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d  .  p->iFixedOp =
24c0: 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a   v->nOp - 1;.}..
24d0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
24e0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
24f0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2500: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
2510: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
2520: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
2530: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
2540: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
2550: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
2560: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
2570: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
2580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
2590: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
25a0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
25b0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
25c0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
25d0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
25e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
25f0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
2600: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
2610: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
2620: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
2630: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
2640: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
2650: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2660: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
2670: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
2680: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
2690: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
26a0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
26b0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
26e0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
26f0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
2700: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
2710: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
2720: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
2730: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
2740: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
2750: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2760: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
2770: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2780: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
2790: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
27a0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
27b0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
27c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
27d0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
27e0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
27f0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
2800: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2810: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2820: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2830: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2850: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2860: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2870: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2890: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
28a0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
28b0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
28c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
28e0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
28f0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
2900: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2910: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2920: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2930: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2940: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2950: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2960: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2970: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2980: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2990: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
29a0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
29b0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
29c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29d0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
29e0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
29f0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
2a00: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2a10: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2a20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2a30: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2a40: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2a50: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2a60: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2a70: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2a80: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2a90: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2aa0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
2ab0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
2ac0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
2ad0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
2ae0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
2af0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
2b00: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2b10: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2b20: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2b30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2b40: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2b50: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b70: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2b80: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2b90: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2ba0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
2bb0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
2bc0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
2bd0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
2be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
2bf0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
2c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c10: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2c20: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2c30: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c50: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2c60: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2c70: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2c80: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2c90: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2ca0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
2cb0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
2cc0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
2cd0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
2ce0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
2cf0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
2d00: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2d10: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2d20: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2d30: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2d40: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2d50: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2d60: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2d70: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2d80: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2d90: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2da0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
2db0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
2dc0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
2dd0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
2de0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
2df0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
2e00: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2e10: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2e20: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2e30: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2e40: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2e50: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2e60: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2e70: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
2e80: 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f  ateTable and OP_
2e90: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66  InitCoroutine (f
2ea0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
2eb0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
2ec0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
2ed0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
2ee0: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
2ef0: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
2f00: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
2f10: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
2f20: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
2f30: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
2f40: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
2f50: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
2f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f70: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
2f80: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
2f90: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
2fa0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
2fb0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
2fc0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
2fd0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
2fe0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
2ff0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3000: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3010: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3020: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3030: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3040: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3050: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3060: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3070: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3080: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3090: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
30a0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
30b0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
30c0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
30d0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
30e0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
30f0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3100: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3110: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3120: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3130: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3140: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3150: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3160: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3170: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3180: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3190: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
31a0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
31b0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
31c0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
31d0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
31e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
31f0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3200: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3210: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3220: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3230: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3240: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
3250: 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74 65  able ) hasCreate
3260: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
3270: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
3280: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
3290: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
32a0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
32b0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
32c0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
32d0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
32e0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
32f0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
3300: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
3310: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
3320: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
3330: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
3340: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
3350: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
3360: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
3370: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
3380: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
3390: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
33a0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
33b0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
33c0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
33d0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
33e0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
33f0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
3400: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
3410: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
3420: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
3430: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
3440: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
3450: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
3460: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
3470: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
3480: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
3490: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34a0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
34b0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
34c0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
34d0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
34e0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
34f0: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
3500: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3510: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
3520: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
3530: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
3540: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
3550: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3560: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
3570: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
3580: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
3590: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
35a0: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
35b0: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
35c0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
35d0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
35e0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
35f0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
3600: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
3610: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
3620: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
3630: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
3640: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
3650: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
3660: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3670: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
3680: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
3690: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
36a0: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
36b0: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
36c0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
36d0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
36e0: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
36f0: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
3700: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
3710: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
3720: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
3730: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
3740: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
3750: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
3760: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
3770: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
3780: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
3790: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
37a0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
37b0: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f  oring labels..*/
37c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
37d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
37e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
37f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3800: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3810: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3820: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3840: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3850: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
3860: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
3870: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
3880: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
3890: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
38a0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
38b0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
38c0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
38d0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
38e0: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
38f0: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3900: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3910: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3920: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3930: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3940: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3950: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
3960: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
3970: 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  saction: {.     
3980: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
3990: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
39a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
39b0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
39c0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
39d0: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
39e0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76       case OP_Sav
39f0: 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20  epoint: {.      
3a00: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
3a10: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
3a20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
3a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
3a40: 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  AL.      case OP
3a50: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
3a60: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
3a70: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
3a80: 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
3a90: 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ode: {.        p
3aa0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3ab0: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
3ac0: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
3ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3ae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3af0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
3b00: 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  E.      case OP_
3b10: 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  VUpdate: {.     
3b20: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
3b30: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3b40: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
3b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b60: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3b70: 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20  OP_VFilter: {.  
3b80: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
3b90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
3ba0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
3bb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3bc0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
3bd0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
3be0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
3bf0: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ].p1;.        if
3c00: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
3c10: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20  MaxArgs = n;.   
3c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
3c40: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20   case OP_Next:. 
3c50: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
3c60: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63  tIfOpen:.      c
3c70: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
3c80: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t: {.        pOp
3c90: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
3ca0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
3cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
3cc0: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
3cd0: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
3ce0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3cf0: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20   case OP_Prev:. 
3d00: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
3d10: 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  vIfOpen: {.     
3d20: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
3d30: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
3d40: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
3d50: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3d60: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
3d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3d90: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73  pOp->opflags = s
3da0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
3db0: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20  erty[opcode];.  
3dc0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
3dd0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
3de0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
3df0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
3e00: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50  t( -1-pOp->p2<pP
3e10: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  arse->nLabel );.
3e20: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
3e30: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
3e40: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
3e50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3e60: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
3e70: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
3e80: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
3e90: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
3ea0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
3eb0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
3ec0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
3ed0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
3ee0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
3ef0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
3f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
3f10: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3f20: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3f30: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
3f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3f50: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
3f60: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
3f70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3f80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
3f90: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
3fa0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3fb0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
3fc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
3fd0: 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61  ray of opcodes a
3fe0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
3ff0: 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  * the Vdbe passe
4000: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4010: 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74  rgument. It is t
4020: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
4030: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
4040: 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
4050: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74  returned array t
4060: 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  o be eventually 
4070: 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20  freed using the 
4080: 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72  .** vdbeFreeOpAr
4090: 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ray() function..
40a0: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
40b0: 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73  urning, *pnOp is
40c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
40d0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
40e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
40f0: 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70   array. Also, *p
4100: 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74  nMaxArg is set t
4110: 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  o the larger of 
4120: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
4130: 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75  e and .** the nu
4140: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4150: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  in the Vdbe.apAr
4160: 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72  g[] array requir
4170: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
4180: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70  e .** returned p
4190: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f  rogram..*/.VdbeO
41a0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
41b0: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
41c0: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
41d0: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
41e0: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
41f0: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
4200: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
4210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
4220: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
4230: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4240: 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63  tree() was not c
4250: 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d  alled on this VM
4260: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62   */.  assert( Db
4270: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4280: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20  treeMask) );..  
4290: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
42a0: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
42b0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
42c0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
42d0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
42e0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
42f0: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
4300: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
4310: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
4320: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
4330: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
4340: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
4350: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4360: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
4370: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
4380: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
4390: 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e  *aOp, int iLinen
43a0: 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  o){.  int addr, 
43b0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
43c0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
43d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
43e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
43f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4400: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4410: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4420: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4430: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4440: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4450: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4460: 70 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  p;.  pOut = &p->
4470: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72  aOp[addr];.  for
4480: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
4490: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
44a0: 7b 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 61  {.    int p2 = a
44b0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 70 4f 75 74  Op->p2;.    pOut
44c0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e  ->opcode = aOp->
44d0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74  opcode;.    pOut
44e0: 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a  ->p1 = aOp->p1;.
44f0: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a      if( p2<0 ){.
4500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4510: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4520: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4530: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4540: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
4550: 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   = addr + ADDR(p
4560: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
4570: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4580: 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  p2;.    }.    pO
4590: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
45a0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
45b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
45c0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
45d0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
45e0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
45f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4600: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4610: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
4620: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
4630: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
4640: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
4650: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
4660: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
4670: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4680: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4690: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
46a0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
46b0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
46c0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
46d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
46e0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
46f0: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4700: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4710: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4720: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  Op;.  return add
4730: 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  r;.}..#if define
4740: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4750: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
4760: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
4770: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
4780: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
4790: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
47a0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
47b0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
47c0: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
47d0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
4800: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
4810: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
4820: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
4830: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4840: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
4850: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
4860: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
4870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4880: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
4890: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
48a0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
48c0: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
48d0: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
48e0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
4910: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
4920: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
4930: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4950: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
4960: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
4970: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
4980: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
4990: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
49a0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
49b0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
49c0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
49d0: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
49e0: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
49f0: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
4a00: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
4a10: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
4a20: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
4a30: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
4a40: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
4a50: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
4a60: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
4a70: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
4a80: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
4a90: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
4aa0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
4ab0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
4ac0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4ad0: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
4ae0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
4af0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
4b00: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
4b10: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4b20: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
4b30: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4b40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4b50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4b60: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4b70: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4b80: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4b90: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4ba0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4bb0: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4bc0: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4bd0: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4be0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4bf0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
4c00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
4c10: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4c20: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4c30: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4c40: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
4c50: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4c60: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
4c70: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4c80: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4c90: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
4ca0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4cb0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4cc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4cd0: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
4ce0: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
4cf0: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
4d00: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4d10: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
4d20: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4d30: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4d40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
4d50: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
4d60: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
4d70: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
4d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4d90: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4da0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
4db0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4dc0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4de0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
4df0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4e00: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4e10: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4e20: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4e30: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4e40: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
4e50: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4e60: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4e70: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
4e80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
4e90: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
4ea0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4eb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
4ec0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
4ed0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4ee0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  0 );.  if( p->aO
4ef0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
4f00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
4f10: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4f20: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
4f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4f40: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f50: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
4f60: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
4f70: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
4f80: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
4f90: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
4fa0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
4fb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
4fc0: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
4fd0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
4fe0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4ff0: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
5000: 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  p);.  p->pParse-
5010: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
5020: 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Op - 1;.}.../*.*
5030: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
5040: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
5050: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
5060: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
5070: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
5080: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
5090: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
50a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
50b0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
50c0: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
50d0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
50e0: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
50f0: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
5100: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
5110: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
5120: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5130: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
5140: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
5150: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
5160: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
5170: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
5180: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
5190: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
51a0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
51b0: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
51c0: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
51d0: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
51e0: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
51f0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
5200: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
5210: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
5220: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
5230: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
5240: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73  Function(db, ((s
5250: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
5260: 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  p4)->pFunc);.   
5270: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
5280: 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65  ough into the ne
5290: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  xt case */.     
52a0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
52b0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
52c0: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
52d0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
52e0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
52f0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
5300: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5310: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
5320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5330: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5340: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
5350: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5360: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5370: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
5380: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
5390: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
53a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
53b0: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
53c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
53d0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
53e0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
53f0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5400: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5410: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
5420: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
5430: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
5440: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
5450: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
5460: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5470: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
5480: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5490: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
54a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
54b0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
54c0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
54d0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
54e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
54f0: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
5500: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5510: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
5520: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5530: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
5540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5550: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ree(db, p);.    
5560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5570: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5580: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
5590: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
55a0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
55b0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61  ==0 ) sqlite3Vta
55c0: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
55d0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
55e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
55f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5600: 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20   Free the space 
5610: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
5620: 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c  p and any p4 val
5630: 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ues allocated fo
5640: 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73  r the.** opcodes
5650: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
5660: 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74  n. If aOp is not
5670: 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75   NULL it is assu
5680: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a  med to contain .
5690: 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20  ** nOp entries. 
56a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56b0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
56c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20  sqlite3 *db, Op 
56d0: 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  *aOp, int nOp){.
56e0: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
56f0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f   Op *pOp;.    fo
5700: 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26  r(pOp=aOp; pOp<&
5710: 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29  aOp[nOp]; pOp++)
5720: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
5730: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
5740: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
5750: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5760: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5770: 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  S.      sqlite3D
5780: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
5790: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
57a0: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
57b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
57c0: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
57d0: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
57e0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
57f0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
5800: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
5810: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
5820: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
5830: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
5840: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
5850: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
5860: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
5870: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
5880: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5890: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
58a0: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
58b0: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
58c0: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
58d0: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
58e0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
58f0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
5900: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
5910: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
5920: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
5930: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
5940: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5950: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
5960: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
5970: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a   addr<p->nOp ){.
5980: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
5990: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
59a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
59b0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
59c0: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
59d0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
59e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
59f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
5a00: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
5a10: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
5a20: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70  .    if( addr==p
5a30: 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70  ->nOp-1 ) p->nOp
5a40: 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
5a50: 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63   If the last opc
5a60: 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20  ode is "op" and 
5a70: 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70  it is not a jump
5a80: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a   destination,.**
5a90: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e   then remove it.
5aa0: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
5ab0: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20   and only if an 
5ac0: 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76  opcode was remov
5ad0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5ae0: 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f  e3VdbeDeletePrio
5af0: 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c  rOpcode(Vdbe *p,
5b00: 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28   u8 op){.  if( (
5b10: 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50  p->nOp-1)>(p->pP
5b20: 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20  arse->iFixedOp) 
5b30: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
5b40: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29  -1].opcode==op )
5b50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5b60: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c  eChangeToNoop(p,
5b70: 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20   p->nOp-1);.    
5b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
5b90: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
5ba0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
5bb0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5bc0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
5bd0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
5be0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
5bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5c00: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
5c10: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
5c20: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
5c30: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
5c40: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
5c50: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
5c60: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
5c70: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
5c80: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
5c90: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
5ca0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
5cb0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
5cc0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
5cd0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
5ce0: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
5cf0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
5d00: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5d10: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
5d20: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
5d30: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
5d40: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
5d50: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
5d60: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
5d70: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
5d80: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
5d90: 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zP4..** .** Othe
5da0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
5db0: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
5dc0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
5dd0: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
5de0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
5df0: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
5e00: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
5e10: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
5e20: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
5e30: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
5e40: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
5e50: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
5e60: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
5e70: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
5e80: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
5e90: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
5ea0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
5eb0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5ec0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5ed0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5ee0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
5ef0: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
5f00: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
5f10: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
5f20: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
5f30: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
5f40: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
5f50: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
5f60: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
5f70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5f80: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50   ){.    if( n!=P
5f90: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20  4_VTAB ){.      
5fa0: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
5fb0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
5fc0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
5fd0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
5fe0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
5ff0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
6000: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
6010: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6020: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6030: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
6040: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73  >aOp[addr];.  as
6050: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
6060: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20  e==P4_NOTUSED.  
6070: 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74       || pOp->p4t
6080: 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20  ype==P4_INT32.  
6090: 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74       || pOp->p4t
60a0: 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ype==P4_KEYINFO 
60b0: 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20  );.  freeP4(db, 
60c0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
60d0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
60e0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
60f0: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
6100: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
6110: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
6120: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
6130: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
6140: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
6150: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
6160: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
6170: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
6180: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
6190: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
61a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
61b0: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
61c0: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
61d0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
61e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
61f0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6200: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
6210: 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
6220: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
6230: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
6240: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
6250: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
6260: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b  f( n==P4_VTAB ){
6270: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6280: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
6290: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
62a0: 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69  4_VTAB;.    sqli
62b0: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
62c0: 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20  ble *)zP4);.    
62d0: 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65  assert( ((VTable
62e0: 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e   *)zP4)->db==p->
62f0: 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  db );.  }else if
6300: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
6310: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
6320: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
6330: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
6340: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
6350: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
6360: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6370: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
6380: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
6390: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
63a0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
63b0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
63c0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f  YNAMIC;.  }.}../
63d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20  *.** Set the P4 
63e0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
63f0: 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64  ntly added opcod
6400: 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  e to the KeyInfo
6410: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65   for the.** inde
6420: 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  x given..*/.void
6430: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
6440: 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  4KeyInfo(Parse *
6450: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
6460: 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Idx){.  Vdbe *v 
6470: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6480: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
64a0: 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  x!=0 );.  sqlite
64b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
64c0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69   -1, (char*)sqli
64d0: 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
64e0: 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c  x(pParse, pIdx),
64f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6500: 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
6510: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
6520: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
6530: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
6540: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
6550: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
6560: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
6570: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
6580: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
6590: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
65a0: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
65b0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
65c0: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
65d0: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
65e0: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
65f0: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
6600: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
6610: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
6620: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
6630: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
6640: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
6650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6660: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
6670: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6680: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
6690: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
66a0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
66b0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
66c0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
66d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
66e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
66f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
6700: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
6710: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
6720: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
6730: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
6740: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
6750: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
6760: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
6770: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
6780: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
6790: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
67a0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
67b0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
67c0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
67d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
67e0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
67f0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
6800: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
6810: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
6820: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
6830: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6840: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
6850: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
6860: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
6870: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6880: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
6890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
68a0: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
68b0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
68c0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
68d0: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
68e0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
68f0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
6900: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
6910: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
6920: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
6940: 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63  alue if the iSrc
6950: 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74  Line field for t
6960: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  he previously co
6970: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
6980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6990: 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65  VdbeSetLineNumbe
69a0: 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  r(Vdbe *v, int i
69b0: 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Line){.  sqlite3
69c0: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
69d0: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
69e0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
69f0: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
6a00: 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AGE */../*.** Re
6a10: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
6a20: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
6a30: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
6a40: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
6a50: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
6a60: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
6a70: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
6a80: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
6a90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6aa0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
6ab0: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
6ac0: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
6ad0: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
6ae0: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
6af0: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
6b00: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
6b10: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
6b20: 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72  dable but not wr
6b30: 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69  itable, though i
6b40: 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77  t is cast to a w
6b50: 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a  ritable value..*
6b60: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20  * The return of 
6b70: 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61  a dummy opcode a
6b80: 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74  llows the call t
6b90: 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74  o continue funct
6ba0: 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20  ioning.** after 
6bb0: 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74  an OOM fault wit
6bc0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
6bd0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6be0: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
6bf0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
6c00: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
6c10: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
6c20: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
6c30: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
6c40: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
6c50: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
6c60: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
6c70: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
6c80: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
6c90: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
6ca0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
6cb0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
6cc0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
6cd0: 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66  .  /* C89 specif
6ce0: 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ies that the con
6cf0: 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69  stant "dummy" wi
6d00: 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
6d10: 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65  d to all.  ** ze
6d20: 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f  ros, which is co
6d30: 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e  rrect.  MSVC gen
6d40: 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67  erates a warning
6d50: 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20  , nevertheless. 
6d60: 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65  */.  static Vdbe
6d70: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
6d80: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
6d90: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
6da0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
6db0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
6dc0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
6dd0: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
6de0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
6df0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
6e00: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
6e10: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
6e20: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
6e30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
6e40: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
6e50: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
6e60: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
6e70: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
6e80: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
6e90: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
6ea0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6eb0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
6ec0: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
6ed0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
6ee0: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
6ef0: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
6f00: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
6f10: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
6f20: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
6f30: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
6f40: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
6f50: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
6f60: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
6f70: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
6f80: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
6f90: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
6fa0: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
6fb0: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
6fc0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
6fd0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
6fe0: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
6ff0: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
7000: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
7010: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
7020: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
7030: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e   opcode listing.
7040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70  .**.** The Synop
7050: 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f  sis: field in co
7060: 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64  mments in the vd
7070: 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65  be.c source file
7080: 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a   gets converted.
7090: 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73  ** to an extra s
70a0: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70  tring that is ap
70b0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71  pended to the sq
70c0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
70d0: 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62  ).  In the.** ab
70e0: 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63  sence of other c
70f0: 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79  omments, this sy
7100: 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74  nopsis becomes t
7110: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
7120: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d  e opcode..** Som
7130: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63  e translation oc
7140: 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  curs:.**.**     
7150: 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20    "PX"      ->  
7160: 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20  "r[X]".**       
7170: 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72  "PX@PY"   ->  "r
7180: 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20  [X..X+Y-1]"  or 
7190: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
71a0: 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22   or 1.**       "
71b0: 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b  PX@PY+1" ->  "r[
71c0: 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22  X..X+Y]"    or "
71d0: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a  r[x]" if y is 0.
71e0: 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59  **       "PY..PY
71f0: 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22  "  ->  "r[X..Y]"
7200: 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20        or "r[x]" 
7210: 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69  if y<=x.*/.stati
7220: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d  c int displayCom
7230: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70  ment(.  const Op
7240: 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68   *pOp,     /* Th
7250: 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63  e opcode to be c
7260: 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f  ommented */.  co
7270: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
7280: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f   /* Previously o
7290: 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f  btained value fo
72a0: 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r P4 */.  char *
72b0: 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20  zTemp,       /* 
72c0: 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72  Write result her
72d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70  e */.  int nTemp
72e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
72f0: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ce available in 
7300: 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  zTemp[] */.){.  
7310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e  const char *zOpN
7320: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
7330: 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20  r *zSynopsis;.  
7340: 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69  int nOpName;.  i
7350: 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70  nt ii, jj;.  zOp
7360: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70  Name = sqlite3Op
7370: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
7380: 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65  code);.  nOpName
7390: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
73a0: 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69  30(zOpName);.  i
73b0: 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61  f( zOpName[nOpNa
73c0: 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me+1] ){.    int
73d0: 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20   seenCom = 0;.  
73e0: 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53    char c;.    zS
73f0: 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d  ynopsis = zOpNam
7400: 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31  e += nOpName + 1
7410: 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d  ;.    for(ii=jj=
7420: 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26  0; jj<nTemp-1 &&
7430: 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b   (c = zSynopsis[
7440: 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a  ii])!=0; ii++){.
7450: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27        if( c=='P'
7460: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
7470: 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b  zSynopsis[++ii];
7480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
7490: 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '4' ){.         
74a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
74b0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
74c0: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29  p+jj, "%s", zP4)
74d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
74e0: 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20  if( c=='X' ){.  
74f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7500: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7510: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
7520: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65  );.          see
7540: 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  nCom = 1;.      
7550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7560: 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e     int v1 = tran
7570: 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a  slateP(c, pOp);.
7580: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32            int v2
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
75a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
75b0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
75c0: 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20   "%d", v1);.    
75d0: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
75e0: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
75f0: 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b  , "@P", 2)==0 ){
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
7610: 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20  += 3;.          
7620: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
7630: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
7640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
7650: 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a  2 = translateP(z
7660: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f  Synopsis[ii], pO
7670: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
7680: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
7690: 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c  opsis+ii+1,"+1",
76a0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
76b0: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a         ii += 2;.
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32                v2
76d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
76e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
76f0: 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20  ( v2>1 ){.      
7700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7710: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7720: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e  j, zTemp+jj, "..
7730: 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20  %d", v1+v2-1);. 
7740: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7750: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7760: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7770: 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c  is+ii+1, "..P3",
7780: 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70   4)==0 && pOp->p
7790: 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  3==0 ){.        
77a0: 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20      ii += 4;.   
77b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
77c0: 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d   }.        jj +=
77d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
77e0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
77f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7800: 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63   zTemp[jj++] = c
7810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7820: 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d      if( !seenCom
7830: 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26   && jj<nTemp-5 &
7840: 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  & pOp->zComment 
7850: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7860: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7870: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b  jj, zTemp+jj, ";
7880: 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d   %s", pOp->zComm
7890: 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b  ent);.      jj +
78a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
78b0: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
78c0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54   }.    if( jj<nT
78d0: 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20  emp ) zTemp[jj] 
78e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
78f0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
7900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
7910: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7920: 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  emp, "%s", pOp->
7930: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a  zComment);.    j
7940: 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
7950: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65  n30(zTemp);.  }e
7960: 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30  lse{.    zTemp[0
7970: 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20  ] = 0;.    jj = 
7980: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7990: 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  jj;.}.#endif /* 
79a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
79b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
79c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
79d0: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
79e0: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
79f0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
7a00: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
7a10: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7a20: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
7a30: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
7a40: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
7a50: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
7a60: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
7a70: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
7a80: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
7a90: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
7aa0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
7ab0: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
7ac0: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
7ad0: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
7ae0: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
7af0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
7b00: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
7b10: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
7b20: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
7b30: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
7b40: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
7b50: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
7b60: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
7b70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7b80: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
7b90: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
7ba0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7bb0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7bc0: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
7bd0: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
7be0: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
7bf0: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
7c00: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
7c10: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
7c20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
7c30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
7c40: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
7c50: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
7c60: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
7c70: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
7c80: 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20  me : "nil";.    
7c90: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
7ca0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
7cb0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
7cc0: 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==6 && memcmp(z
7cd0: 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29  Coll,"BINARY",6)
7ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7cf0: 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20   zColl = "B";.  
7d00: 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20          n = 1;. 
7d10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d20: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37   if( i+n>nTemp-7
7d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
7d40: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
7d50: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
7d60: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
7d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7d90: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
7da0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
7db0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
7dc0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
7dd0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
7de0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
7df0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
7e00: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
7e10: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
7e20: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
7e30: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
7e40: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
7e50: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
7e60: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
7e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7e80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7e90: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
7ea0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7eb0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
7ec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7ed0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7ee0: 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22  zTemp, "(%.20s)"
7ef0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
7f00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7f20: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
7f30: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
7f40: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
7f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7f60: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7f70: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
7f80: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
7f90: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
7fa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
7fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7fc0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7fd0: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
7fe0: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7ff0: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
8000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8010: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8020: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
8030: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
8040: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
8050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8060: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
8070: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
8080: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8090: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
80a0: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
80b0: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
80c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
80d0: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
80e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
80f0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8100: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
8110: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
8120: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8130: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
8140: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8150: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8160: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
8170: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
8180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8190: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
81a0: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
81b0: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
81c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
81d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
81e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
81f0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
8200: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
8210: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
8220: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8230: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8240: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
8250: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
8260: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8270: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
8280: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
8290: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
82a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
82b0: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
82c0: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
82d0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
82e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
82f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8300: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8310: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
8320: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8330: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8340: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
8350: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
8360: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
8370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8380: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
8390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
83a0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
83b0: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
83d0: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
83e0: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
83f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
8400: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8410: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c  Temp, "vtab:%p",
8420: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
8430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8440: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
8450: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
8460: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8470: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8480: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
8490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
84a0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
84b0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
84c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
84d0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
84e0: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
84f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8500: 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43    case P4_ADVANC
8510: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  E: {.      zTemp
8520: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [0] = 0;.      b
8530: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8540: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8550: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
8560: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
8570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
8580: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
8590: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
85a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
85b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34   }.  assert( zP4
85c0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
85d0: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  zP4;.}.#endif../
85e0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20  *.** Declare to 
85f0: 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68  the Vdbe that th
8600: 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61  e BTree object a
8610: 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20  t db->aDb[i] is 
8620: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
8630: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8640: 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  nts need to know
8650: 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20   in advance the 
8660: 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a  complete set of.
8670: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
8680: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
8690: 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20  be use.  A mask 
86a0: 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73  of these databas
86b0: 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69  es.** is maintai
86c0: 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  ned in p->btreeM
86d0: 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63  ask.  The p->loc
86e0: 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74  kMask value is t
86f0: 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  he subset of.** 
8700: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20  p->btreeMask of 
8710: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
8720: 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f  ill require a lo
8730: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
8740: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
8750: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
8760: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  {.  assert( i>=0
8770: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
8780: 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f   && i<(int)sizeo
8790: 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a  f(yDbMask)*8 );.
87a0: 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74    assert( i<(int
87b0: 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65  )sizeof(p->btree
87c0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d  Mask)*8 );.  DbM
87d0: 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d  askSet(p->btreeM
87e0: 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69  ask, i);.  if( i
87f0: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
8800: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
8810: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
8820: 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
8830: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b  p->lockMask, i);
8840: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
8850: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8860: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
8870: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
8880: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
8890: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
88a0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
88b0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
88c0: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
88d0: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
88e0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
88f0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
8900: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
8910: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
8920: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
8930: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
8940: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
8950: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
8960: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
8970: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
8980: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
8990: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
89a0: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
89b0: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
89c0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
89d0: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
89e0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
89f0: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
8a00: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
8a10: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
8a20: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
8a30: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
8a40: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
8a50: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
8a60: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
8a70: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
8a80: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
8a90: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
8aa0: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
8ab0: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
8ac0: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
8ad0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8ae0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
8af0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
8b00: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
8b10: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
8b20: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
8b30: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
8b40: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
8b50: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
8b60: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
8b70: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
8b80: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
8b90: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
8ba0: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
8bb0: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
8bc0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
8bd0: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
8be0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
8bf0: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
8c00: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
8c10: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
8c20: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
8c30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
8c40: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
8c50: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
8c60: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
8c70: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
8c80: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
8c90: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
8ca0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
8cb0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8cc0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
8cd0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
8ce0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
8cf0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
8d00: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
8d10: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
8d20: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
8d30: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
8d40: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
8d50: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
8d60: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
8d70: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
8d80: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
8d90: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
8da0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
8db0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
8dc0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
8dd0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
8de0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8df0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
8e00: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
8e10: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
8e20: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
8e30: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
8e40: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
8e50: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
8e60: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
8e70: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
8e80: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76  _NOINLINE void v
8e90: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
8ea0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8eb0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
8ec0: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
8ed0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
8ee0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
8ef0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
8f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
8f10: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
8f20: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
8f30: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
8f40: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
8f50: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
8f60: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
8f70: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
8f80: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
8f90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8fa0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8fb0: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
8fc0: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
8fd0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
8fe0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
8ff0: 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29  /.  vdbeLeave(p)
9000: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
9010: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
9020: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
9030: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
9040: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
9050: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
9060: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9070: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
9080: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
9090: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
90a0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
90b0: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
90c0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
90d0: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
90e0: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
90f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
9100: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
9110: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
9120: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
9130: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
9140: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
9150: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
9160: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
9170: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
9180: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
9190: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
91a0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
91b0: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
91c0: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
91d0: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
91e0: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
91f0: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
9200: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
9210: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
9220: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
9230: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
9240: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
9250: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
9260: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
9270: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
9280: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
9290: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
92a0: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
92b0: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
92c0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
92d0: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
92e0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
92f0: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
9300: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
9310: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
9320: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
9330: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
9340: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
9350: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
9360: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
9370: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
9380: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
9390: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
93a0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
93b0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
93c0: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
93d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
93e0: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
93f0: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
9400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
9410: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
9420: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
9430: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
9440: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
9450: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9460: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
9470: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
9480: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
9490: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
94a0: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
94b0: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
94c0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
94d0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
94e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
94f0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
9500: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
9510: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
9520: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
9530: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
9540: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
9550: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
9560: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
9570: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
9580: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
9590: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
95a0: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
95b0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
95c0: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
95d0: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
95e0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
95f0: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
9600: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
9610: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
9620: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
9630: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
9640: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
9650: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
9660: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
9670: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
9680: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
9690: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
96a0: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
96b0: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
96c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
96d0: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
96e0: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
96f0: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
9700: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
9710: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
9720: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
9730: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
9740: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
9750: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
9760: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
9770: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
9780: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
9790: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
97a0: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
97b0: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
97c0: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
97d0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
97e0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
97f0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
9800: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
9810: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
9820: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
9830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9840: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72  ->flags & MEM_Fr
9850: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ame );.      tes
9860: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
9870: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a  & MEM_RowSet );.
9880: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
9890: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
98a0: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
98b0: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
98c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
98d0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
98e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
98f0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
9900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9910: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
9920: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
9930: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
9940: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
9950: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
9960: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
9970: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
9980: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
9990: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
99a0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
99b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
99c0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
99d0: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
99e0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
99f0: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
9a00: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
9a10: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
9a20: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
9a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9a40: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
9a50: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
9a60: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
9a70: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
9a80: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
9a90: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
9aa0: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
9ab0: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
9ac0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
9ad0: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
9ae0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
9af0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
9b00: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
9b10: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
9b20: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
9b30: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
9b40: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
9b50: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
9b60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
9b70: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
9b80: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
9b90: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
9ba0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
9bb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
9bc0: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
9bd0: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
9be0: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
9bf0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
9c00: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
9c10: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
9c20: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
9c30: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
9c40: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
9c50: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
9c60: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
9c70: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
9c80: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
9c90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
9ca0: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
9cb0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
9cc0: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
9cd0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
9ce0: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
9cf0: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
9d00: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
9d10: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
9d20: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
9d30: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
9d40: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
9d50: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
9d60: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
9d70: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
9d80: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
9d90: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
9da0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
9db0: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
9dc0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
9dd0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
9de0: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e00: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
9e10: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
9e40: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
9e50: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
9e60: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9e90: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
9ea0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
9eb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
9ec0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9ed0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
9ee0: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
9ef0: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
9f20: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
9f30: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
9f40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9f50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
9f60: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
9f70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
9f80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9fb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
9fc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
9ff0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
a000: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
a010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
a020: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
a030: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
a040: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
a050: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
a060: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
a070: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
a080: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a090: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
a0a0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
a0b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a0c0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
a0d0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
a0e0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
a0f0: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
a100: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
a110: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
a120: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
a130: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
a140: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
a150: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
a160: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
a170: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
a180: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
a190: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
a1a0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
a1b0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
a1c0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
a1d0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a1e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
a1f0: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
a200: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
a210: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
a220: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
a230: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
a240: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
a250: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
a260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
a270: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
a280: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
a290: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
a2a0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
a2b0: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
a2c0: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
a2d0: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
a2e0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
a2f0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
a300: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
a310: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
a320: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
a330: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a340: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
a350: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
a360: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
a370: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
a380: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
a390: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
a3a0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
a3b0: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
a3c0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
a3d0: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
a3e0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
a3f0: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
a400: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
a410: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
a420: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
a430: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
a440: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
a450: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
a460: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
a470: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
a480: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
a490: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
a4a0: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
a4b0: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
a4c0: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
a4d0: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
a4e0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
a4f0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
a500: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
a510: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
a520: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
a530: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
a540: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
a550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
a560: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
a570: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
a580: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
a590: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
a5a0: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
a5b0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
a5c0: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
a5d0: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
a5e0: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
a5f0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
a600: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
a610: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
a620: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
a630: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
a640: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
a650: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
a660: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
a670: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
a680: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
a690: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
a6a0: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
a6b0: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
a6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
a6d0: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
a6e0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
a6f0: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
a700: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
a710: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
a720: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
a730: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
a740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a750: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a760: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
a770: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
a780: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
a790: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
a7a0: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
a7b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
a7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
a7d0: 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72  ror(p, sqlite3Er
a7e0: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
a7f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
a800: 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  *zP4;.    Op *pO
a810: 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  p;.    if( i<p->
a820: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nOp ){.      /* 
a830: 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  The output line 
a840: 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20  number is small 
a850: 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61  enough that we a
a860: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a  re still in the.
a870: 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72        ** main pr
a880: 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  ogram. */.      
a890: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
a8a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a8b0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72     /* We are cur
a8c0: 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73  rently listing s
a8d0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67  ubprograms.  Fig
a8e0: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
a8f0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  e and.      ** p
a900: 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f  ick up the appro
a910: 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a  priate opcode. *
a920: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
a930: 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70       i -= p->nOp
a940: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
a950: 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   i>=apSub[j]->nO
a960: 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; j++){.       
a970: 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e   i -= apSub[j]->
a980: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
a990: 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b     pOp = &apSub[
a9a0: 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  j]->aOp[i];.    
a9b0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
a9c0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
a9d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a9e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
a9f0: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aa20: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
aa30: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
aa40: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
aa50: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
aa60: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
aa70: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
aa80: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
aa90: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
aaa0: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
aab0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
aac0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
aad0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
aae0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
aaf0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
ab00: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ab10: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
ab20: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
ab30: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
ab40: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
ab50: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
ab60: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
ab70: 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61  t has.      ** a
ab80: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
ab90: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
aba0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
abb0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
abc0: 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b  grams.      ** k
abd0: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
abe0: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
abf0: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
ac00: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
ac10: 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20  rogram.      ** 
ac20: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
ac30: 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20  been seen..     
ac40: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
ac50: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
ac60: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
ac70: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
ac80: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
ac90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
aca0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
acb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
acc0: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
acd0: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
ace0: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
acf0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
ad00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ad10: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
ad20: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
ad30: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
ad40: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
ad50: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
ad60: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
ad70: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
ad80: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
ad90: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
ada0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
adb0: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
adc0: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
add0: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
ade0: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
adf0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
ae00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ae10: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
ae20: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
ae30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
ae40: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
ae70: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
ae80: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
ae90: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
aea0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
aed0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
aee0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
aef0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
af00: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
af30: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
af40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
af50: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
af60: 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b  ize(pMem, 32) ){
af70: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
af80: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
af90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
afa0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
afb0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
afc0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
afd0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
afe0: 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69  rm;.    zP4 = di
aff0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
b000: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
b010: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
b020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b030: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
b040: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
b050: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
b060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
b070: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
b080: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
b090: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
b0a0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
b0b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
b0c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
b0d0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a    }.    pMem++;.
b0e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
b0f0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
b100: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
b110: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
b120: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
b130: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b140: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b150: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
b160: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b180: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b190: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
b1a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
b1b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b1c0: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
b1d0: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
b1e0: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
b1f0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
b200: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
b210: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
b220: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
b230: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
b240: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
b250: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b260: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
b270: 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20  Mem, 500) ){.   
b280: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b290: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
b2b0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b2c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b2d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b2e0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
b2f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
b300: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
b310: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
b320: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
b330: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
b340: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
b350: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b360: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65  /* Comment */.#e
b390: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
b3a0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
b3b0: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
b3c0: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  n-1);.    p->pRe
b3d0: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
b3e0: 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63  em[1];.    p->rc
b3f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b400: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
b410: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
b420: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
b430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
b440: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
b450: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
b460: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
b470: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
b480: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
b490: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
b4a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
b4b0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
b4c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
b4d0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
b4e0: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
b4f0: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
b500: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
b510: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
b520: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
b530: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
b540: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
b550: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
b560: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f   ){.      z = pO
b570: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77  p->p4.z;.      w
b580: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
b590: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
b5a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b5b0: 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a  z ) printf("SQL:
b5c0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a   [%s]\n", z);.}.
b5d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
b5e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b5f0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
b600: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b610: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
b620: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
b630: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
b640: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
b650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b660: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
b670: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
b680: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
b690: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
b6a0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
b6b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
b6c0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
b6d0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
b6e0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
b6f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
b700: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
b710: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
b720: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
b730: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
b740: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
b750: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
b760: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
b770: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
b780: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
b790: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
b7a0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
b7b0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
b7c0: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
b7d0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
b7e0: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
b7f0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
b800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
b820: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
b830: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b840: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
b850: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
b860: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
b870: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
b880: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
b890: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
b8a0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
b8b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
b8c0: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
b8d0: 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72  ize buffer and r
b8e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b8f0: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65  to.** that space
b900: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
b910: 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69  nt space is avai
b920: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55  lable, return NU
b930: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42  LL..**.** The pB
b940: 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  uf parameter is 
b950: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
b960: 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77  e of a pointer w
b970: 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63  hich will.** rec
b980: 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d  eive the new mem
b990: 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f  ory.  pBuf is no
b9a0: 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66  rmally NULL.  If
b9b0: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
b9c0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b9d0: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  hat memory space
b9e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b9f0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
ba00: 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75  that.** this rou
ba10: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
ba20: 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77  allocate any new
ba30: 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70   memory.  When p
ba40: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
ba50: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  LL simply return
ba60: 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c   pBuf.  Only all
ba70: 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79  ocate new memory
ba80: 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66   space when pBuf
ba90: 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
baa0: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
bab0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
bac0: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
bad0: 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70  .**.** *ppFrom p
bae0: 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62  oints to availab
baf0: 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e  le space and pEn
bb00: 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  d points to the 
bb10: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76  end of the.** av
bb20: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20  ailable space.  
bb30: 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c  When space is al
bb40: 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d  located, *ppFrom
bb50: 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73   is advanced pas
bb60: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
bb70: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  the allocated sp
bb80: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79  ace..**.** *pnBy
bb90: 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20  te is a counter 
bba0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
bbb0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
bbc0: 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64  that have failed
bbd0: 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e  .** to allocate.
bbe0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e    If there is in
bbf0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
bc00: 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73   in *ppFrom to s
bc10: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65  atisfy the.** re
bc20: 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72  quest, then incr
bc30: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79  ement *pnByte by
bc40: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
bc50: 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73  he request..*/.s
bc60: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
bc70: 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a  cSpace(.  void *
bc80: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f  pBuf,          /
bc90: 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70  * Where return p
bca0: 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73  ointer will be s
bcb0: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tored */.  int n
bcc0: 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
bcd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
bce0: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  es to allocate *
bcf0: 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c  /.  u8 **ppFrom,
bd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
bd10: 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f  UT: Allocate fro
bd20: 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75  m *ppFrom */.  u
bd30: 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  8 *pEnd,        
bd40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
bd50: 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68  o 1 byte past th
bd60: 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d  e end of *ppFrom
bd70: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
bd80: 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20   *pnByte        
bd90: 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69    /* If allocati
bda0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64  on cannot be mad
bdb0: 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  e, increment *pn
bdc0: 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  Byte */.){.  ass
bdd0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
bde0: 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f  ALIGNMENT(*ppFro
bdf0: 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  m) );.  if( pBuf
be00: 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a   ) return pBuf;.
be10: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
be20: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26  (nByte);.  if( &
be30: 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d  (*ppFrom)[nByte]
be40: 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   <= pEnd ){.    
be50: 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70  pBuf = (void*)*p
be60: 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72  pFrom;.    *ppFr
be70: 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  om += nByte;.  }
be80: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74  else{.    *pnByt
be90: 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  e += nByte;.  }.
bea0: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
beb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
bec0: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
bed0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
bee0: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
bef0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
bf00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bf10: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
bf20: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
bf30: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
bf40: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
bf50: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
bf60: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
bf70: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
bf80: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
bf90: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
bfa0: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
bfb0: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
bfc0: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
bfd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
bfe0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
bff0: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
c000: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
c010: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
c020: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
c030: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
c040: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
c050: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
c060: 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=1; i<p->nMem;
c070: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
c080: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
c090: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
c0a0: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
c0b0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
c0c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
c0d0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
c0e0: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  bort;.  p->magic
c0f0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
c100: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
c110: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
c120: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
c130: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
c140: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
c150: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
c160: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
c170: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
c180: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
c190: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c1a0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
c1b0: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
c1c0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
c1d0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
c1e0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
c1f0: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
c200: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
c210: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
c220: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
c230: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
c240: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
c250: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
c260: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
c270: 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20  ating registers 
c280: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
c290: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
c2a0: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
c2b0: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
c2c0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
c2d0: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
c2e0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
c2f0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
c300: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
c310: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c320: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
c330: 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63  ctly once on eac
c340: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
c350: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
c360: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c370: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
c380: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
c390: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
c3a0: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
c3b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c3c0: 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c  led, further cal
c3d0: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
c3e0: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
c3f0: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
c400: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
c410: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
c420: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
c430: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
c440: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
c450: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
c460: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
c470: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
c480: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
c490: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
c4a0: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
c4b0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
c4c0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c4d0: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
c4e0: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
c4f0: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
c500: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
c510: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
c520: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
c530: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
c540: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
c550: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
c580: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
c590: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
c5a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c5b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
c5c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
c5f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c600: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
c630: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
c640: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
c650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c660: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
c670: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
c680: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
c6b0: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
c6c0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c6f0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
c700: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
c710: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c730: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
c740: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
c750: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c780: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72  er */.  u8 *zCsr
c790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c7a0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
c7b0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
c7c0: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  llocation */.  u
c7d0: 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *zEnd;        
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
c800: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
c810: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  y */.  int nByte
c820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c830: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
c840: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69  h extra memory i
c850: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61  s needed */..  a
c860: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
c870: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
c880: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c890: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
c8a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
c8b0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
c8c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c8d0: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
c8e0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
c8f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
c900: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
c910: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
c920: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
c930: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
c940: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
c950: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
c960: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
c970: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
c980: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
c990: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
c9a0: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
c9b0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
c9c0: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
c9d0: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
c9e0: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
c9f0: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
ca00: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
ca10: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
ca20: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
ca30: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
ca40: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
ca50: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
ca60: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
ca70: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
ca80: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
ca90: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
caa0: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
cab0: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
cac0: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
cad0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
cae0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
caf0: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
cb00: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
cb10: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
cb20: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
cb30: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
cb40: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
cb50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
cb60: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
cb70: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
cb80: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
cb90: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
cba0: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
cbb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
cbc0: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
cbd0: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
cbe0: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
cbf0: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
cc00: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
cc10: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
cc20: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
cc30: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
cc40: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cc60: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
cc70: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
cc80: 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29  /.  zEnd = (u8*)
cc90: 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e  &p->aOp[pParse->
cca0: 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46  nOpAlloc];  /* F
ccb0: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65  irst byte past e
ccc0: 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a  nd of zCsr[] */.
ccd0: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
cce0: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
ccf0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
cd00: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
cd10: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
cd20: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
cd30: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
cd40: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
cd50: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
cd60: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65  m = 10;.  }.  me
cd70: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
cd80: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72  nd-zCsr);.  zCsr
cd90: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
cda0: 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28  )0)&7;.  assert(
cdb0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
cdc0: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
cdd0: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
cde0: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
cdf0: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
ce00: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
ce10: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
ce20: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
ce30: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
ce40: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
ce50: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
ce60: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
ce70: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
ce80: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
ce90: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
cea0: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
ceb0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
cec0: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
ced0: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
cee0: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
cef0: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
cf00: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
cf10: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
cf20: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
cf30: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
cf40: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
cf50: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
cf60: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
cf70: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
cf80: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
cf90: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
cfa0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
cfb0: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
cfc0: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
cfd0: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
cfe0: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
cff0: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
d000: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
d010: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
d020: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
d030: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
d040: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
d050: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
d060: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d070: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
d080: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
d090: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
d0a0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
d0b0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
d0c0: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
d0d0: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
d0e0: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
d0f0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
d100: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
d110: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
d120: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
d130: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
d140: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
d150: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
d160: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
d170: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
d180: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
d190: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d1c0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e  yte);.    p->aOn
d1d0: 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70  ceFlag = allocSp
d1e0: 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  ace(p->aOnceFlag
d1f0: 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20  , nOnce, &zCsr, 
d200: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23  zEnd, &nByte);.#
d210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d220: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
d230: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
d240: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  c = allocSpace(p
d250: 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
d260: 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a  *sizeof(i64), &z
d270: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
d280: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  e);.#endif.    i
d290: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
d2a0: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
d2b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
d2c0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
d2d0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
d2e0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
d2f0: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
d300: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
d310: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
d320: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
d330: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
d340: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
d350: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
d360: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
d370: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
d380: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
d390: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
d3a0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
d3b0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
d3c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
d3d0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
d3e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d3f0: 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72 73 65  >azVar && pParse
d400: 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20  ->nzVar>0 ){.   
d410: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
d420: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
d430: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
d440: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
d450: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
d460: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
d470: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
d480: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
d490: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
d4a0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
d4b0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
d4c0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
d4d0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4f0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
d500: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
d510: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
d540: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
d550: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
d560: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
d570: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
d580: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
d590: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
d5a0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
d5b0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
d5c0: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
d5d0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
d5e0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
d5f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
d600: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
d610: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
d620: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
d630: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
d640: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
d650: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
d660: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
d670: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
d680: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
d690: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d6a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
d6b0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
d6c0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
d6d0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
d6e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d6f0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
d700: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
d710: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
d720: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
d730: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
d740: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
d750: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
d760: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
d770: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
d780: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
d790: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
d7a0: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
d7b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d7c0: 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20  UALTABLE.  else 
d7d0: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
d7e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
d7f0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
d800: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
d810: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
d820: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
d830: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
d840: 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  le = pVtabCursor
d850: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
d860: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  ;.    assert( pV
d870: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
d880: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
d890: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
d8a0: 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ab->nRef--;.    
d8b0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
d8c0: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
d8d0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d8e0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
d8f0: 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  ors in the curre
d900: 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nt frame..*/.sta
d910: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75  tic void closeCu
d920: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62  rsorsInFrame(Vdb
d930: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
d940: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
d950: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
d960: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
d970: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
d980: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
d990: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
d9a0: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
d9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
d9c0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
d9d0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
d9e0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
d9f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
da00: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
da10: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
da20: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
da30: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
da40: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
da50: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
da60: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
da70: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
da80: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
da90: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
daa0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
dab0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
dac0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
dad0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
dae0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
daf0: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73  Frame->v;.  clos
db00: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
db10: 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v);.#ifdef SQLIT
db20: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
db30: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
db40: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
db50: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
db60: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
db70: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
db80: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
db90: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
dba0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
dbb0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
dbc0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
dbd0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
dbe0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
dbf0: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
dc00: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
dc10: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
dc20: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
dc30: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
dc40: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
dc50: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
dc60: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
dc70: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
dc80: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
dc90: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
dca0: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
dcb0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
dcc0: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
dcd0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
dce0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
dcf0: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
dd00: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
dd10: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
dd20: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
dd30: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
dd40: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
dd50: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
dd60: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
dd70: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
dd80: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
dd90: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
dda0: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
ddb0: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
ddc0: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
ddd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dde0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
ddf0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
de00: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
de10: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
de20: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
de30: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
de40: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
de50: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
de60: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
de70: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
de80: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
de90: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
dea0: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
deb0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
dec0: 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
ded0: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
dee0: 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66  InFrame(p);.  if
def0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
df00: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
df10: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
df20: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
df30: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
df40: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
df50: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
df60: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
df70: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
df80: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
df90: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
dfa0: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
dfb0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
dfc0: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
dfd0: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
dfe0: 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
dff0: 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
e000: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
e010: 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a  Data(p, -1, 0);.
e020: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
e030: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
e040: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
e050: 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e  e VM after a sin
e060: 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74  gle run..*/.stat
e070: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
e080: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
e090: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
e0a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e0b0: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
e0c0: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
e0d0: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
e0e0: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
e0f0: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
e100: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
e110: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
e120: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
e130: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
e140: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
e150: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
e160: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
e170: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
e180: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
e190: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
e1a0: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
e1b0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
e1c0: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
e1d0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
e1e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
e1f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e200: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
e210: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
e220: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
e230: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
e240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e250: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
e260: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
e270: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
e280: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
e290: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
e2a0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
e2b0: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
e2c0: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
e2d0: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
e2e0: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
e2f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
e300: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
e310: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
e320: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
e330: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
e340: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
e350: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
e360: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
e370: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
e380: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
e390: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e3a0: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
e3b0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
e3c0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
e3d0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
e3e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e3f0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
e400: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
e410: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
e420: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
e430: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
e440: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
e450: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
e460: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
e470: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
e480: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
e490: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
e4a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
e4b0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
e4c0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
e4d0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
e4e0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
e4f0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
e500: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
e510: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
e520: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
e530: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
e540: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
e550: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
e560: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
e570: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
e580: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
e590: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
e5a0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
e5b0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
e5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
e5d0: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
e5e0: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
e5f0: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
e600: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
e610: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
e620: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
e630: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
e640: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
e650: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
e660: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
e670: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
e680: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
e690: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
e6a0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
e6b0: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
e6c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
e6d0: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
e6e0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e700: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
e710: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
e720: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e740: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
e750: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
e760: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
e790: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
e7a0: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
e7b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7d0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
e7e0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
e7f0: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
e800: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
e810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
e820: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
e830: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
e840: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
e850: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
e860: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
e870: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
e880: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
e890: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
e8a0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
e8b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
e8c0: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
e8d0: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
e8e0: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
e8f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e900: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e910: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
e920: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
e930: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
e940: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
e950: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
e960: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
e970: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
e980: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e990: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
e9a0: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
e9b0: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
e9c0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
e9d0: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
e9e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
e9f0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
ea00: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
ea10: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
ea20: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
ea30: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
ea40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
ea50: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
ea60: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
ea70: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
ea80: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
ea90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
eaa0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
eab0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
eac0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
ead0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
eae0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
eaf0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
eb00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
eb10: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
eb20: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
eb30: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
eb40: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
eb50: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
eb60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
eb70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eb80: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
eb90: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
eba0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
ebc0: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
ebd0: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
ebe0: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
ebf0: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
ec00: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
ec10: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
ec20: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
ec30: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
ec40: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
ec50: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
ec60: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
ec70: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
ec80: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
ec90: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
eca0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
ecb0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
ecc0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
ecd0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
ece0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
ecf0: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
ed00: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
ed10: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
ed20: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
ed30: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
ed40: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
ed50: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
ed60: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
ed70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
ed80: 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
ed90: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
eda0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
edb0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
edc0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
edd0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
ede0: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
edf0: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
ee00: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
ee10: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
ee20: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
ee30: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
ee40: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
ee50: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
ee60: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
ee70: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
ee80: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
ee90: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
eea0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
eeb0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
eec0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
eed0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
eee0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
eef0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
ef00: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
ef10: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
ef20: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
ef30: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
ef40: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
ef50: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
ef60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
ef70: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
ef80: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
ef90: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
efa0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
efb0: 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
efc0: 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
efd0: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
efe0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
eff0: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
f000: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
f010: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f020: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
f030: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f040: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
f050: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
f060: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
f070: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
f080: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
f090: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
f0a0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
f0b0: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
f0c0: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
f0d0: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
f0e0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f0f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
f100: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
f110: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f120: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
f130: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
f140: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
f150: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
f160: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
f170: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
f180: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
f190: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
f1a0: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
f1b0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
f1c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f1d0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
f1e0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
f1f0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
f200: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
f210: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
f220: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
f230: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
f240: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
f250: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
f260: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
f270: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
f280: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
f290: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
f2a0: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
f2b0: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
f2c0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
f2d0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
f2e0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
f2f0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
f300: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
f310: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
f320: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
f330: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
f340: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
f350: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f360: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f370: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
f380: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f390: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f3a0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
f3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f3c0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
f3d0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
f3e0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
f3f0: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
f400: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
f410: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
f420: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
f430: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
f440: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
f450: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
f460: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
f470: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
f480: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
f490: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
f4a0: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
f4b0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
f4c0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
f4d0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
f4e0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
f4f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
f500: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
f510: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f520: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f530: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f540: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f550: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f560: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f570: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
f580: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f590: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
f5a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f5b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
f5c0: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
f5d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
f5e0: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
f5f0: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
f600: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
f610: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
f620: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
f630: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f640: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
f650: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
f660: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
f670: 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f  atomically..  */
f680: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f690: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
f6a0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
f6b0: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
f6c0: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
f6d0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
f6e0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
f6f0: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
f700: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
f710: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
f720: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
f730: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
f740: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
f750: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
f760: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
f770: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
f780: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
f790: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
f7a0: 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
f7b0: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
f7c0: 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
f7d0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
f7e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f7f0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
f800: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
f810: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
f820: 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
f830: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
f840: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
f850: 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
f860: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
f870: 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
f880: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f890: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
f8a0: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
f8b0: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
f8c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
f8d0: 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f8f0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
f900: 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
f910: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
f920: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f930: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
f940: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
f950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f960: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
f970: 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
f980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f990: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
f9a0: 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
f9b0: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
f9c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f9d0: 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
f9e0: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
f9f0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
fa00: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
fa10: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
fa20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
fa30: 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
fa40: 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
fa50: 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
fa80: 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
fa90: 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
faa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
fab0: 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
fac0: 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
fad0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
fae0: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
faf0: 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
fb00: 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
fb10: 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
fb20: 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
fb30: 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
fb40: 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
fb50: 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
fb60: 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
fb70: 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
fb80: 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
fb90: 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
fba0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
fbb0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
fbc0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
fbd0: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
fbe0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
fbf0: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
fc00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
fc10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
fc20: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
fc30: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
fc40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fc50: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
fc60: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
fc70: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
fc80: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fc90: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
fca0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
fcb0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
fcc0: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
fcd0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
fce0: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
fcf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
fd00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fd10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fd20: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
fd30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
fd40: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
fd50: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
fd60: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
fd70: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
fd80: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
fd90: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
fda0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fdb0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
fdc0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
fdd0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
fde0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
fdf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fe00: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
fe10: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
fe20: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
fe30: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
fe40: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
fe50: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
fe60: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
fe70: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
fe80: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
fe90: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
fea0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
feb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fec0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
fed0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
fee0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
fef0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
ff00: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
ff10: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
ff20: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
ff30: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
ff40: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
ff50: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
ff60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
ff70: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
ff80: 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
ff90: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
ffa0: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
ffb0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
ffc0: 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
ffd0: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
ffe0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
fff0: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
10000 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
10010 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
10020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10030 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10040 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
10050 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
10060 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
10070 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
10080 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
10090 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
100a0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
100b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
100c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
100d0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
100e0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
100f0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10100 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10110 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
10120 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10130 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
10170 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
10180 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10190 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
101a0 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
101b0 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
101c0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
101d0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
101e0 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
101f0 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
10200 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
10210 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
10220 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
10230 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
10240 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
10250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
10260 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
10270 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
10280 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
10290 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
102a0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
102b0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
102c0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
102d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
102e0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
102f0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
10300 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
10310 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
10320 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
10330 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
10340 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
10350 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
10360 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10370 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
10380 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
10390 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
103a0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
103b0 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
103c0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
103d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
103e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
103f0 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
10400 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
10410 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
10420 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
10430 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
10440 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
10450 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
10460 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
10470 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
10480 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
10490 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
104a0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
104b0 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
104c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
104d0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
104e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
104f0 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
10500 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
10510 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
10520 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
10530 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
10540 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
10550 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10560 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10570 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
10580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10590 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
105a0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
105b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
105c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
105d0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
105e0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
105f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
10600 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
10610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10620 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10630 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
10640 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10650 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
10660 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
10670 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
10680 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
10690 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
106a0 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
106b0 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
106c0 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
106d0 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
106e0 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
106f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
10700 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
10710 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
10720 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10730 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10740 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73  needSync);.    s
10750 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10760 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
10770 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
10780 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
107a0 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
107b0 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
107c0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
107d0 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
107e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
107f0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
10800 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10810 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
10820 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
10830 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
10840 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
10850 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
10860 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
10870 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
10880 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
10890 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
108a0 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
108b0 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
108c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
108d0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
108e0 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
108f0 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
10900 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
10910 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
10920 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
10930 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
10940 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
10950 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
10960 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10970 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
10980 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
10990 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
109a0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
109b0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
109c0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
109d0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
109e0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
109f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10a00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
10a10 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
10a20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10a30 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
10a40 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
10a50 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10a60 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
10a70 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
10a80 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
10a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10aa0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
10ab0 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
10ac0 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
10ad0 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
10ae0 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
10af0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10b00 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
10b10 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
10b20 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
10b30 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
10b40 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
10b50 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
10b60 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
10b70 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
10b80 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
10b90 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
10ba0 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
10bb0 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
10bc0 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
10bd0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
10be0 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
10bf0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
10c00 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
10c10 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
10c20 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
10c30 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
10c40 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
10c50 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
10c60 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
10c70 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
10c80 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
10c90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
10ca0 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
10cb0 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
10cc0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
10cd0 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
10ce0 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
10cf0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
10d00 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
10d10 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
10d20 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
10d30 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
10d40 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
10d50 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
10d60 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
10d70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
10d80 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
10d90 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
10da0 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
10db0 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
10dc0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
10dd0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
10de0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10df0 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
10e00 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
10e10 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
10e20 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
10e30 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
10e40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10e50 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
10e60 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
10e70 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
10e80 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
10e90 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
10ea0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
10eb0 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
10ec0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
10ed0 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
10ee0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10ef0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
10f00 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
10f10 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10f20 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
10f30 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
10f40 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
10f50 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
10f60 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
10f70 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
10f80 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
10f90 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
10fa0 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
10fb0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
10fc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10fd0 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
10fe0 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
10ff0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
11000 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
11010 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
11020 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11030 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
11040 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
11050 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
11060 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
11070 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
11080 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73  e occurred, caus
11090 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
110a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
110b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
110c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
110d0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
110e0 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
110f0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
11100 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
11110 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
11120 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
11130 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
11140 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
11150 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
11160 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
11170 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
11180 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
11190 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
111a0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
111b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
111c0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
111d0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
111e0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
111f0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
11200 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11210 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
11220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11230 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11240 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11250 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
11260 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
11270 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
11280 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
11290 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
112a0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
112b0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
112c0 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
112d0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
112e0 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
112f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11300 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
11310 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
11320 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
11330 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
11340 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
11350 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
11360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11370 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
11380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
113a0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
113b0 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
113c0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
113d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
113e0 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
113f0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11400 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
11410 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
11420 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
11430 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
11440 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
11450 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
11460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11470 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11480 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
11490 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
114a0 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
114b0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
114c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
114d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
114e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
114f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
11500 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
11510 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
11520 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
11530 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
11540 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
11550 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
11560 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
11570 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
11580 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
11590 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
115a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
115b0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
115c0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
115d0 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
115e0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
115f0 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
11600 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
11610 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11640 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
11650 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
11660 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
11670 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
11680 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
11690 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
116a0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
116b0 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
116c0 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
116d0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
116e0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
116f0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
11700 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
11710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
11720 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
11730 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
11740 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
11750 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
11760 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
11770 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11780 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
11790 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
117a0 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
117b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
117c0 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
117d0 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
117e0 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
117f0 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
11800 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
11810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11820 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
11830 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
11840 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
11850 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
11860 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11870 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
11880 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
11890 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
118a0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
118b0 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
118c0 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
118d0 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
118e0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
118f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11900 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
11910 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
11920 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
11930 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
11940 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
11950 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
11960 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
11970 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11980 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11990 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
119a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
119b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
119c0 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
119d0 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
119e0 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
119f0 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
11a00 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
11a10 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
11a20 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
11a30 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
11a40 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
11a50 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
11a60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
11a70 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
11a80 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
11a90 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
11aa0 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
11ab0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
11ac0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
11ad0 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
11ae0 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
11af0 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
11b00 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
11b10 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
11b20 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
11b30 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
11b40 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
11b50 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
11b60 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
11b70 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
11b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11b90 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
11ba0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
11bb0 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
11bc0 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
11bd0 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
11be0 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
11bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11c00 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
11c10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
11c40 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
11c50 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
11c60 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11c70 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
11c80 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
11c90 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
11ca0 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
11cb0 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
11cc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
11cd0 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
11ce0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
11cf0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
11d00 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
11d10 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
11d20 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
11d30 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
11d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
11d50 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
11d60 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
11d70 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
11d80 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
11d90 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
11da0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11db0 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
11dc0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
11dd0 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
11de0 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
11df0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
11e00 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
11e10 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
11e20 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
11e30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
11e40 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
11e50 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
11e60 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
11e70 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
11e80 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
11e90 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
11ea0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
11eb0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11ec0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
11ed0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
11ee0 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d  p->aOnceFlag ) m
11ef0 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c  emset(p->aOnceFl
11f00 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46  ag, 0, p->nOnceF
11f10 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  lag);.  closeAll
11f20 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
11f30 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
11f40 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
11f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11f60 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
11f70 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
11f80 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
11f90 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
11fa0 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
11fb0 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
11fc0 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
11fd0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
11fe0 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
11ff0 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
12000 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
12010 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
12020 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
12030 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
12040 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
12050 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
12060 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
12070 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
12080 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
12090 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
120a0 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
120b0 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
120c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
120d0 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
120e0 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
120f0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
12100 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
12110 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
12120 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
12130 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
12140 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
12150 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
12160 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
12170 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
12180 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
12190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
121a0 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
121b0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
121c0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
121d0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
121e0 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
121f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
12200 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
12210 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
12220 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
12230 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
12240 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
12250 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
12260 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
12270 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
12280 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
12290 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
122a0 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
122b0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
122c0 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
122d0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
122e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
122f0 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
12300 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
12310 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
12320 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
12330 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
12340 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
12350 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
12360 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
12370 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
12380 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
12390 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
123a0 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
123b0 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
123c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
123d0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
123e0 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
123f0 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
12400 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
12410 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
12420 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
12430 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
12440 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
12450 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
12460 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
12470 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
12480 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
12490 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
124a0 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
124b0 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
124c0 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
124d0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
124e0 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
124f0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
12500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
12510 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12520 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12530 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
12550 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
12560 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
12570 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
12580 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
12590 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
125a0 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
125b0 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
125c0 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
125d0 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
125e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
125f0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
12600 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
12610 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
12620 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12630 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12640 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
12650 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12660 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
12670 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
126a0 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
126b0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
126c0 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
126d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
126e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
126f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
12700 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
12710 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
12720 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12730 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
12740 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
12750 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
12760 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
12770 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
12780 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
12790 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
127a0 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
127b0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
127c0 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
127d0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
127e0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
127f0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
12800 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
12810 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
12820 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
12830 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
12840 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
12850 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
12860 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
12870 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
12880 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
12890 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
128a0 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
128b0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
128c0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
128d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
128e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
128f0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
12900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12920 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
12930 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
12940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12950 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
12960 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12970 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12980 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12990 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
129a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
129b0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
129c0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
129d0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
129e0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
129f0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
12a00 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
12a10 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
12a20 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
12a30 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
12a40 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
12a50 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
12a60 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
12a70 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
12a80 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
12a90 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
12aa0 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
12ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
12ac0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
12ad0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
12ae0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
12af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12b10 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
12b20 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
12b30 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
12b40 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
12b60 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
12b70 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
12b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12b90 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
12ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12bb0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12bc0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
12bd0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12be0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
12bf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
12c00 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
12c10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
12c20 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
12c30 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
12c40 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
12c50 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
12c60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12c70 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
12c80 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
12c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12cb0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12cc0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
12cd0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
12ce0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
12cf0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
12d00 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
12d10 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
12d20 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
12d30 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12d40 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
12d50 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
12d60 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
12d70 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
12d80 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
12d90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
12da0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
12db0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
12dc0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
12dd0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12de0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
12df0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12e00 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12e10 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
12e20 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
12e30 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
12e40 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
12e50 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
12e60 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
12e70 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
12e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12e90 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
12ea0 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
12eb0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
12ec0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12ed0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
12ee0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
12ef0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
12f00 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
12f10 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
12f20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
12f30 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
12f40 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
12f50 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
12f60 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
12f70 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
12f80 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
12f90 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12fa0 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
12fb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
12fc0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
12fd0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
12fe0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
12ff0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
13000 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
13010 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
13020 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
13030 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13040 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
13050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
13060 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
13070 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
13080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
13090 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
130a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
130b0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
130c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
130d0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
130e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
130f0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13100 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
13110 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
13120 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
13130 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
13140 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
13150 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13160 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13170 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13180 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
13190 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
131a0 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
131b0 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
131c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
131d0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
131e0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
131f0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
13200 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
13210 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
13220 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
13230 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
13240 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
13250 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
13260 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
13270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13280 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
13290 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
132a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
132b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
132c0 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
132d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
132e0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
132f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
13300 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
13310 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13320 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
13330 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
13340 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
13350 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
13360 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
13370 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
13380 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
13390 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
133a0 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
133b0 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
133c0 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
133d0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
133e0 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
133f0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
13400 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
13410 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
13420 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
13430 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
13440 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
13450 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
13460 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
13470 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
13480 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
13490 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
134a0 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
134b0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
134c0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
134d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
134e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
134f0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
13500 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
13510 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
13520 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
13530 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
13540 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
13550 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
13560 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
13570 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
13580 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
13590 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
135a0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
135b0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
135c0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
135d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
135e0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
135f0 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
13600 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
13610 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
13620 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
13630 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
13640 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
13650 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
13660 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
13670 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
13680 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
13690 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
136a0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
136b0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
136c0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
136d0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
136e0 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
136f0 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
13700 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
13710 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13720 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
13730 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
13740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13750 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
13760 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
13770 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
13780 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
13790 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
137a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
137b0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
137c0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
137d0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
137e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
137f0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
13800 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
13810 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
13820 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13830 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
13840 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
13850 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
13860 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
13870 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
13880 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
13890 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
138a0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
138b0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
138c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
138d0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
138e0 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
138f0 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  g ){.    u8 mall
13900 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  ocFailed = db->m
13910 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
13920 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
13930 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
13940 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
13950 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
13960 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
13970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
13980 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
13990 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
139a0 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
139b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
139c0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
139d0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
139e0 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
139f0 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46  Failed = mallocF
13a00 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65  ailed;.    db->e
13a10 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
13a20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
13a30 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
13a40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13a50 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13a60 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
13a70 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
13a80 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
13a90 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
13aa0 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
13ab0 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
13ac0 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
13ad0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
13ae0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
13af0 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
13b00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13b10 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
13b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
13b30 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
13b40 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
13b50 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
13b60 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
13b70 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
13b80 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
13b90 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
13ba0 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
13bb0 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
13bc0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13bd0 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
13be0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
13bf0 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
13c00 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
13c10 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
13c30 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
13c40 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
13c50 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
13c60 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
13c70 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
13c80 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
13c90 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
13ca0 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
13cb0 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
13cc0 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
13cd0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
13ce0 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
13cf0 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
13d00 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
13d10 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
13d20 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
13d30 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
13d40 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
13d50 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
13d60 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
13d70 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
13d80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
13d90 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
13da0 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
13db0 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
13dc0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
13dd0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
13de0 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
13df0 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
13e00 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
13e10 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
13e20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13e30 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
13e40 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
13e50 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
13e60 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
13e70 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
13e80 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
13e90 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
13ea0 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
13eb0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
13ec0 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
13ed0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
13ee0 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
13ef0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
13f00 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
13f10 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
13f20 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
13f30 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
13f40 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
13f50 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
13f60 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
13f70 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
13f80 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
13f90 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
13fa0 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
13fb0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
13fc0 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
13fd0 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
13fe0 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
13ff0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
14000 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
14010 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
14020 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
14030 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
14040 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
14050 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
14060 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
14070 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14080 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
14090 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
140a0 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
140b0 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
140c0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
140d0 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
140e0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
140f0 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
14100 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
14110 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
14120 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
14130 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
14140 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
14150 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
14160 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
14170 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
14180 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
14190 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
141a0 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
141b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
141c0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
141d0 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73  p->rc, p->zErrMs
141e0 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d  g ? "%s" : 0, p-
141f0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  >zErrMsg);.    s
14200 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14210 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
14220 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
14230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
14240 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
14250 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
14260 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
14270 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
14280 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
14290 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
142a0 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
142b0 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
142c0 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
142d0 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
142e0 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
142f0 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
14300 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
14310 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
14320 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
14330 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14340 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
14350 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14360 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
14370 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
14380 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
14390 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
143a0 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c       if( p->zSql
143b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
143c0 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20   c, pc = 0;.    
143d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
143e0 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
143f0 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
14400 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69  ->zSql[i])!=0; i
14410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
14420 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70  f( pc=='\n' ) fp
14430 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
14440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
14450 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
14460 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14480 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70  f( pc!='\n' ) fp
14490 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
144a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
144b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
144c0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
144d0 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b   char zHdr[100];
144e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
144f0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
14500 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25  (zHdr), zHdr, "%
14510 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20  6u %12llu %8llu 
14520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
14530 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
14540 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
14550 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
14560 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
14570 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
14580 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
14590 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
145a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72    );.        fpr
145b0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
145c0 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  zHdr);.        s
145d0 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
145e0 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
145f0 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
14600 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
14610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14620 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74  if.  p->iCurrent
14630 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d  Time = 0;.  p->m
14640 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
14650 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
14660 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
14670 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
14680 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
14690 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
146a0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
146b0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
146c0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
146d0 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
146e0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
146f0 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
14700 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
14710 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
14720 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
14730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14740 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
14750 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
14760 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
14770 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
14780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14790 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
147a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
147b0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
147c0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
147d0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
147e0 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
147f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
14800 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73  parameter iOp is
14810 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
14820 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
14830 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
14840 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  ** all auxiliary
14850 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
14860 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
14870 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
14880 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   as.** the first
14890 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
148a0 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67   Or, if iOp is g
148b0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
148c0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
148d0 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  en the destructo
148e0 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76  r is.** only inv
148f0 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61  oked for those a
14900 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
14910 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62  inters created b
14920 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66  y the user .** f
14930 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20  unction invoked 
14940 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69  by the OP_Functi
14950 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73  on opcode at ins
14960 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20  truction iOp of 
14970 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e  .** VM pVdbe, an
14980 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a  d only then if:.
14990 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  **.**    * the a
149a0 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69  ssociated functi
149b0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  on parameter is 
149c0 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65  the 32nd or late
149d0 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20  r (counting.**  
149e0 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f      from left to
149f0 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a   right), or.**.*
14a00 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65  *    * the corre
14a10 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
14a20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
14a30 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68   clear (where th
14a40 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20  e first.**      
14a50 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
14a60 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  er corresponds t
14a70 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
14a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14a90 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
14aa0 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74  Vdbe *pVdbe, int
14ab0 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b   iOp, int mask){
14ac0 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20  .  AuxData **pp 
14ad0 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61  = &pVdbe->pAuxDa
14ae0 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  ta;.  while( *pp
14af0 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20   ){.    AuxData 
14b00 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20  *pAux = *pp;.   
14b10 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20   if( (iOp<0).   
14b20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d    || (pAux->iOp=
14b30 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69  =iOp && (pAux->i
14b40 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
14b50 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
14b60 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20  x->iArg)))).    
14b70 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
14b80 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33  e( pAux->iArg==3
14b90 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
14ba0 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
14bb0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
14bc0 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
14bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14be0 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65   *pp = pAux->pNe
14bf0 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
14c00 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64  3DbFree(pVdbe->d
14c10 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65  b, pAux);.    }e
14c20 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26  lse{.      pp= &
14c30 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
14c40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14c50 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
14c60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14c70 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
14c80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14c90 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
14ca0 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
14cb0 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
14cc0 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
14cd0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
14ce0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
14cf0 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
14d00 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
14d10 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
14d20 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
14d30 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
14d40 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
14d50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
14d60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
14d70 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
14d80 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
14d90 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
14da0 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
14db0 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
14dc0 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
14dd0 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
14de0 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69   *pNext;.  int i
14df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
14e00 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64  b==0 || p->db==d
14e10 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  b );.  releaseMe
14e20 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
14e30 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65  p->nVar);.  rele
14e40 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
14e50 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
14e60 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
14e70 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
14e80 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
14e90 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
14ea0 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
14eb0 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
14ec0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
14ed0 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
14ee0 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
14ef0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
14f00 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  );.  }.  for(i=p
14f10 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b  ->nzVar-1; i>=0;
14f20 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46   i--) sqlite3DbF
14f30 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72  ree(db, p->azVar
14f40 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65  [i]);.  vdbeFree
14f50 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
14f60 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
14f70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14f80 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
14f90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14fa0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73  b, p->zSql);.  s
14fb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14fc0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 64   p->pFree);.#ifd
14fd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14fe0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
14ff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
15000 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20  >nScan; i++){.  
15010 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15020 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
15030 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
15040 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15050 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69  p->aScan);.#endi
15060 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
15070 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
15080 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15090 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
150a0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
150b0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
150c0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
150d0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
150e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
150f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
15100 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15110 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
15120 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
15130 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
15140 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
15150 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
15160 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
15170 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
15180 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
15190 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
151a0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
151b0 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
151c0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
151d0 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
151e0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
151f0 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
15200 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
15210 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
15220 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22 70  ** The cursor "p
15230 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20  " has a pending 
15240 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74  seek operation t
15250 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hat has not yet 
15260 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20  been.** carried 
15270 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63  out.  Seek the c
15280 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61  ursor now.  If a
15290 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
152a0 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70  return.** the ap
152b0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
152c0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
152d0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
152e0 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72  INE handleDeferr
152f0 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  edMoveto(VdbeCur
15300 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  sor *p){.  int r
15310 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
15320 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74  QLITE_TEST.  ext
15330 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
15340 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
15350 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
15360 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
15370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15380 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 72 63  >isTable );.  rc
15390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
153a0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
153b0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
153c0 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
153d0 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
153e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
153f0 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
15400 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15410 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
15420 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
15430 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
15440 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
15450 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
15460 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
15470 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
15480 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
15490 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
154a0 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
154b0 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
154c0 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
154d0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
154e0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
154f0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
15500 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
15510 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
15520 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
15530 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
15540 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
15550 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
15560 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
15570 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
15580 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
15590 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
155a0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
155b0 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
155c0 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
155d0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
155e0 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
155f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
15600 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
15610 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
15620 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
15630 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
15640 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
15650 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  ( p->pCursor!=0 
15660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
15670 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
15680 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
15690 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  or) );.  rc = sq
156a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
156b0 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73  Restore(p->pCurs
156c0 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
156d0 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
156e0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
156f0 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
15700 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
15710 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
15720 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15730 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
15740 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
15750 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
15760 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
15770 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
15780 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
15790 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
157a0 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
157b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
157c0 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
157d0 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
157e0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  {.  if( sqlite3B
157f0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
15800 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
15810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
15820 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
15830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15850 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15860 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
15870 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
15880 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
15890 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
158a0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
158b0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
158c0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
158d0 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
158e0 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
158f0 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
15900 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
15910 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
15920 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
15930 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
15940 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
15950 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
15960 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
15970 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
15980 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
15990 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
159a0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
159b0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
159c0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
159d0 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
159e0 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
159f0 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
15a00 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
15a10 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
15a20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
15a30 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
15a40 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
15a50 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
15a60 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
15a70 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
15a80 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
15a90 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
15aa0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
15ab0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
15ac0 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
15ad0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
15ae0 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
15af0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
15b00 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70  DeferredMoveto(p
15b10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15b20 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c 69 74  pCursor && sqlit
15b30 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
15b40 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
15b50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15b60 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
15b70 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
15b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15b90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
15ba0 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
15bb0 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
15bc0 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
15bd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15be0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
15bf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15c00 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
15c10 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
15c20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15c30 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
15c40 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
15c50 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
15c60 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
15c70 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
15c80 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
15c90 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
15ca0 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
15cb0 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
15cc0 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
15cd0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
15ce0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
15cf0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
15d00 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
15d10 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
15d20 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
15d30 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
15d40 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
15d50 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
15d60 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
15d70 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
15d80 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
15d90 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
15da0 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
15db0 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
15dc0 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
15dd0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
15de0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
15df0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
15e00 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
15e10 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
15e20 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
15e30 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
15e40 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
15e50 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
15e60 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
15e70 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
15e80 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
15e90 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
15ea0 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
15eb0 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
15ec0 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
15ed0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
15ee0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
15ef0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
15f00 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
15f10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
15f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
15f30 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15f40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
15f50 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
15f60 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
15f70 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
15f80 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15f90 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
15fc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15fd0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
15ff0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
16000 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
16010 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
16020 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
16030 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
16040 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
16070 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
16080 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
16090 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
160a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
160b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
160c0 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
160d0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
160e0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
160f0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
16100 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
16110 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
16120 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
16130 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
16140 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
16150 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
16160 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
16170 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
161a0 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
161b0 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
161c0 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
161d0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
161e0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
161f0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
16200 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
16210 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
16220 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
16230 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
16240 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
16250 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
16260 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
16270 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
16280 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
16290 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
162a0 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
162b0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
162c0 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
162d0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
162e0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
162f0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
16300 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
16310 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
16320 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28  .  u32 n;..  if(
16330 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
16340 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16350 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
16360 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
16370 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
16380 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
16390 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
163a0 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
163b0 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
163c0 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
163d0 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
163e0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
163f0 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
16400 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75  ( i<0 ){.      u
16410 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = ~i;.    }else
16420 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
16430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
16440 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74  127 ){.      ret
16450 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26  urn ((i&1)==i &&
16460 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29   file_format>=4)
16470 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b   ? 8+(u32)u : 1;
16480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
16490 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
164a0 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
164b0 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
164c0 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
164d0 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
164e0 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
164f0 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
16500 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
16510 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
16520 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
16530 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
16540 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
16550 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16560 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
16570 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
16580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
16590 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
165a0 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
165b0 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
165c0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
165d0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
165e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 28 6e    }.  return ((n
165f0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
16600 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
16610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
16620 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
16630 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
16640 31 32 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  12.*/.static con
16650 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
16660 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
16670 7b 0a 20 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  {.  0, 1, 2, 3, 
16680 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
16690 2c 20 30 2c 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  , 0, 0.};../*.**
166a0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
166b0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
166c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
166d0 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
166e0 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
166f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16700 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
16710 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
16720 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
16730 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
16740 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
16750 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
16760 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
16770 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
16780 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
16790 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
167a0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
167b0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
167c0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
167d0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
167e0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
167f0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
16800 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
16810 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
16820 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
16830 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
16840 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
16850 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
16860 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
16870 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
16880 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
16890 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
168a0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
168b0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
168c0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
168d0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
168e0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
168f0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
16900 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
16910 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
16920 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
16930 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
16940 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
16950 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
16960 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
16970 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
16980 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
16990 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
169a0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
169b0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
169c0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
169d0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
169e0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
169f0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
16a00 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
16a10 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
16a20 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
16a30 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
16a40 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
16a50 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
16a60 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
16a70 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
16a80 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
16a90 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
16aa0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
16ab0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
16ac0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
16ad0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
16ae0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
16af0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
16b00 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
16b10 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
16b20 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16b30 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
16b40 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
16b50 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
16b60 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
16b70 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
16b80 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
16b90 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
16ba0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
16bb0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
16bc0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
16bd0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
16be0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
16bf0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
16c00 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
16c10 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
16c20 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
16c30 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
16c40 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
16c50 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
16c60 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
16c70 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
16c80 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
16c90 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
16ca0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
16cb0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
16cc0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
16cd0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
16ce0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
16cf0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
16d00 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
16d10 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
16d20 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
16d30 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
16d40 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
16d50 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
16d60 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
16d70 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
16d80 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
16d90 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
16da0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
16db0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
16dc0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
16dd0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
16de0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
16df0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
16e00 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
16e10 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
16e20 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
16e30 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
16e40 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
16e50 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
16e60 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
16e70 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
16e80 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
16e90 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
16ea0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
16eb0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
16ec0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
16ed0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
16ee0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
16ef0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16f00 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
16f10 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
16f20 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
16f30 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
16f40 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
16f50 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
16f60 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
16f70 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
16f80 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
16f90 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
16fa0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
16fb0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
16fc0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
16fd0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
16fe0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16ff0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
17000 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
17010 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
17020 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
17030 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
17040 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
17050 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
17060 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
17070 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
17080 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
17090 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
170a0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
170b0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
170c0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
170d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
170e0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
170f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
17100 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
17110 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
17120 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
17130 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
17140 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
17150 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
17160 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
17170 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
17180 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
17190 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
171a0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
171b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
171c0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
171d0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
171e0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
171f0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
17200 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
17210 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
17220 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
17230 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
17240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
17250 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
17260 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
17270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
17280 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
17290 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
172a0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
172b0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
172c0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
172d0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
172e0 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
172f0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
17300 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
17310 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
17320 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
17330 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
17340 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
17350 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
17360 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
17370 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
17380 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
17390 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
173a0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
173b0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
173c0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
173d0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
173e0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
173f0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
17400 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
17410 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
17420 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
17430 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
17440 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
17450 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
17460 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
17470 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
17480 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
17490 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
174a0 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
174b0 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
174c0 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
174d0 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
174e0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
174f0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
17500 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
17510 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
17520 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
17530 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
17540 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
17550 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
17560 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
17570 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
17580 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
17590 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
175a0 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
175b0 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
175c0 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
175d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
175e0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
175f0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
17600 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
17610 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
17620 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
17630 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
17640 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
17650 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
17660 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
17670 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
17680 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
17690 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
176a0 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
176b0 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
176c0 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
176d0 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
176e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
176f0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
17700 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
17710 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
17720 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
17730 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
17740 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
17750 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
17760 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
17770 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
17780 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
17790 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
177a0 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
177b0 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
177c0 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
177d0 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
177e0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
177f0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
17800 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
17810 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
17820 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
17830 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
17840 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
17850 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
17860 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
17870 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
17880 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
17890 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
178a0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
178b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
178c0 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
178d0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
178e0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
178f0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
17900 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
17910 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
17920 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
17930 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
17940 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
17950 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17960 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
17970 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17980 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
17990 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
179a0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
179b0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
179c0 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
179d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
179e0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
179f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
17a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17a10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
17a20 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
17a30 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
17a40 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
17a50 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
17a60 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
17a70 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
17a80 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
17a90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17aa0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17ab0 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
17ac0 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
17ad0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
17ae0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
17af0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
17b00 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
17b10 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
17b20 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
17b30 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
17b40 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
17b50 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
17b60 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
17b70 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
17b80 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
17b90 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
17ba0 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
17bb0 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
17bc0 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
17bd0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
17be0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
17bf0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
17c00 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
17c10 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
17c20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
17c30 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
17c40 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
17c50 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
17c60 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
17c70 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
17c80 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
17c90 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
17ca0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
17cb0 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
17cc0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
17cd0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
17ce0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
17cf0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
17d00 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
17d10 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
17d20 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
17d30 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17d40 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
17d50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17d60 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
17d70 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
17d80 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
17d90 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
17da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
17db0 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
17dc0 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
17dd0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
17de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
17df0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
17e00 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
17e10 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
17e20 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
17e30 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
17e40 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
17e50 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
17e60 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
17e70 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
17e80 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
17e90 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
17ea0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17eb0 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
17ec0 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
17ed0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
17ee0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17ef0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
17f00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17f10 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
17f20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17f30 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
17f40 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
17f50 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
17f60 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
17f70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17f80 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
17f90 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17fa0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17fb0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17fc0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17fd0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17fe0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
17ff0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
18000 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
18010 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
18020 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
18030 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
18040 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
18050 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
18060 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
18070 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
18080 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
18090 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
180a0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
180b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
180c0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
180d0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
180e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
180f0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
18100 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
18110 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
18120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18130 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
18140 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
18150 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
18160 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
18170 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
18180 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
18190 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
181a0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
181b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
181c0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
181d0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
181e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
181f0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
18200 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
18210 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
18220 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
18230 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
18240 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
18250 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
18260 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
18270 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
18280 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
18290 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
182a0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
182b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
182c0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
182d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
182e0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
182f0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
18300 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
18310 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
18320 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
18330 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18340 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
18350 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
18360 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
18370 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
18380 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
18390 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
183a0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
183b0 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
183c0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
183d0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
183e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
183f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18400 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
18410 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
18420 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
18430 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
18440 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
18450 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
18460 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
18470 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
18480 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
18490 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
184a0 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
184b0 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
184c0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
184d0 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
184e0 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
184f0 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
18500 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
18510 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
18520 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
18530 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
18540 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
18550 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
18560 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
18570 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
18580 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
18590 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
185a0 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
185b0 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
185c0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
185d0 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
185e0 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
185f0 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
18600 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
18610 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
18620 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18630 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18640 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18650 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
18660 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
18670 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
18680 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
18690 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
186a0 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
186b0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
186c0 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
186d0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
186e0 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
186f0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
18700 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
18710 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
18720 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
18730 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
18740 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
18750 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
18760 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
18770 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
18780 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
18790 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
187a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
187b0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
187c0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
187d0 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
187e0 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
187f0 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
18800 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
18810 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
18820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18830 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
18840 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
18850 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
18860 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
18870 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
18880 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
18890 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
188a0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
188b0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
188c0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
188d0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
188e0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
188f0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
18900 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
18910 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
18920 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
18930 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
18940 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
18950 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
18960 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
18970 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
18980 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
18990 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
189a0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
189b0 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
189c0 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
189d0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
189e0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
189f0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
18a00 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
18a10 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
18a20 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
18a30 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
18a40 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
18a50 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
18a60 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
18a70 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
18a80 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
18a90 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
18aa0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
18ab0 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
18ac0 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
18ad0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
18ae0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
18af0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
18b00 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
18b10 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
18b20 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
18b30 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
18b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
18b50 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
18b60 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
18b70 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b90 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
18ba0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
18bb0 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bd0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
18be0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
18bf0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
18c00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18c20 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
18c30 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
18c40 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
18c70 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
18c80 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
18c90 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18cb0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18cc0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
18cd0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
18ce0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
18cf0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
18d00 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
18d10 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
18d20 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
18d30 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
18d40 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
18d50 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
18d60 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
18d70 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
18d80 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
18d90 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
18da0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
18db0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
18dc0 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
18dd0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
18de0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
18df0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
18e00 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
18e10 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
18e20 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
18e30 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
18e40 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
18e50 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
18e60 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
18e70 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18e80 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
18e90 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
18ea0 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
18eb0 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
18ec0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
18ed0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
18ee0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
18ef0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
18f00 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
18f10 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
18f20 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
18f30 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
18f40 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
18f50 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18f60 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
18f70 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
18f80 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
18f90 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
18fa0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
18fb0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
18fc0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
18fd0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
18fe0 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
18ff0 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
19000 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
19010 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
19020 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
19030 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
19040 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
19050 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19060 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
19070 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
19080 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
19090 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
190a0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
190b0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
190c0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
190d0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
19100 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
19110 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
19120 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
19130 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
19140 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
19150 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
19160 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
19170 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
19180 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
19190 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
191a0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
191b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
191c0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
191d0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
19200 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
19210 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
19240 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
19250 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
19260 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
19270 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
19280 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
19290 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
192a0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
192b0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
192c0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
192d0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
192e0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
192f0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
19300 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
19310 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
19320 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
19330 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
19340 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
19350 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
19360 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
19370 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
19380 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
19390 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
193a0 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
193b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
193c0 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
193d0 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
193e0 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
193f0 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
19400 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19410 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
19420 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
19430 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
19440 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
19450 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
19460 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
19470 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
19480 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
19490 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53  ld = u;.}..#if S
194a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
194b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
194c0 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
194d0 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
194e0 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
194f0 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
19500 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
19510 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
19520 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
19530 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
19540 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
19550 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
19560 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
19570 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
19580 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19590 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
195a0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
195b0 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
195c0 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
195d0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
195e0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
195f0 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
19600 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
19610 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19620 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
19630 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
19640 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
19650 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
19660 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
19670 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
19680 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
19690 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
196a0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
196b0 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
196c0 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
196d0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
196e0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
196f0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
19700 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
19710 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
19720 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
19730 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
19740 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
19750 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19770 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
19780 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
19790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
197a0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
197b0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
197c0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
197d0 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
197e0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
197f0 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
19800 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
19810 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
19820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
19830 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
19840 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
19850 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
19860 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19870 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
19880 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19890 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
198a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
198b0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
198c0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
198d0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
198e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
198f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
19900 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
19910 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
19920 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
19930 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
19940 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
19950 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
19960 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
19970 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
19980 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
19990 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
199a0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
199b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
199c0 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
199d0 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
199e0 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
199f0 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
19a00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
19a10 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
19a20 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
19a30 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
19a40 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
19a50 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
19a60 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
19a70 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
19a80 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
19a90 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
19aa0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
19ab0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
19ac0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
19ad0 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
19ae0 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
19af0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
19b00 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
19b10 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
19b20 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
19b30 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
19b40 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
19b50 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
19b60 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
19b70 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
19b80 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
19b90 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
19ba0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
19bb0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
19bc0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
19bd0 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
19be0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
19bf0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
19c00 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
19c10 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
19c20 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
19c30 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
19c40 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
19c50 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
19c60 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
19c70 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
19c80 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
19c90 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
19ca0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
19cb0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19cc0 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
19cd0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
19ce0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
19cf0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
19d00 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
19d10 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
19d20 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
19d30 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
19d40 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
19d50 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
19d60 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
19d70 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
19d80 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
19d90 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
19da0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
19db0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
19dc0 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
19dd0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
19de0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
19df0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
19e00 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
19e10 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
19e20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
19e30 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
19e40 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
19e50 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
19e60 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
19e70 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
19e80 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
19e90 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
19ea0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
19eb0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
19ec0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
19ed0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
19ee0 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
19ef0 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
19f00 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
19f10 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
19f20 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
19f30 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
19f40 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
19f50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19f60 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
19f70 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
19f80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
19f90 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
19fa0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
19fb0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
19fc0 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
19fd0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
19fe0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
19ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1a000 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1a010 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1a020 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1a030 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1a040 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1a050 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1a060 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1a070 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1a080 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1a090 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1a0a0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1a0b0 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1a0c0 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1a0d0 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1a0e0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1a0f0 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1a100 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1a110 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1a120 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1a130 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1a140 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1a150 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1a160 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1a170 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1a180 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1a190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1a1a0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1a1b0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1a1c0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1a1d0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1a1e0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1a1f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1a200 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1a210 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1a220 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1a230 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1a240 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1a250 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1a260 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1a270 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1a280 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1a290 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1a2a0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1a2b0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1a2c0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1a2d0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1a2e0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1a2f0 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1a300 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1a310 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1a320 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1a330 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1a340 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1a350 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1a360 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1a370 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1a380 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1a390 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1a3a0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1a3b0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1a3c0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1a3d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1a3e0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1a3f0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1a400 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1a410 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1a420 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1a430 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1a440 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1a450 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1a460 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1a470 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1a480 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1a490 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
1a4a0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
1a4b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1a4c0 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1a4d0 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1a4e0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1a4f0 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1a500 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1a510 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1a520 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1a530 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1a540 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1a550 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1a560 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1a570 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1a580 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1a590 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
1a5a0 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
1a5b0 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1a5c0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1a5d0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1a5e0 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1a5f0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1a600 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1a610 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1a620 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1a630 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1a640 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1a650 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1a660 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1a670 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1a680 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1a690 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1a6a0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1a6b0 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1a6c0 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1a6d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1a6e0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1a6f0 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1a700 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1a710 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1a720 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1a730 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1a740 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1a750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1a760 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1a770 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1a780 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1a790 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1a7a0 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1a7b0 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1a7c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1a7d0 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1a7e0 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1a7f0 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1a800 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1a810 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1a820 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1a830 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1a840 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1a850 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1a860 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1a870 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1a880 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1a890 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1a8a0 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1a8b0 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1a8c0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1a8d0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1a8e0 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1a8f0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1a900 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1a910 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1a920 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1a930 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1a940 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1a950 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1a960 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1a970 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1a980 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1a990 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1a9a0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1a9b0 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1a9c0 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1a9d0 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9f0 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1aa00 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1aa10 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1aa20 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1aa30 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1aa40 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1aa50 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1aa60 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1aa70 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1aa80 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1aa90 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1aaa0 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1aab0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1aac0 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1aad0 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1aae0 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1aaf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ab00 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1ab10 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1ab20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
1ab30 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1ab40 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1ab50 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1ab60 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1ab70 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1ab80 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1ab90 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1aba0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1abb0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1abc0 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1abd0 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1abe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1abf0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1ac00 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1ac10 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1ac20 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1ac30 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1ac40 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1ac50 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30  ;.    n1 = v1==0
1ac60 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20   ? 0 : c1.n;.   
1ac70 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1ac80 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1ac90 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1aca0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20  l->enc);.    n2 
1acb0 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32  = v2==0 ? 0 : c2
1acc0 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f  .n;.    rc = pCo
1acd0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1ace0 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e  pUser, n1, v1, n
1acf0 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69  2, v2);.    sqli
1ad00 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ad10 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(&c1);.    sqli
1ad20 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ad30 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66 28 20  e(&c2);.    if( 
1ad40 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1ad50 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72   && prcErr ) *pr
1ad60 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1ad70 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MEM;.    return 
1ad80 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1ad90 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1ada0 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1adb0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1adc0 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1add0 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1ade0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1adf0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1ae00 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1ae10 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1ae20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1ae30 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1ae40 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1ae50 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1ae60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
1ae70 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1ae80 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1ae90 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1aea0 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1aeb0 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  B2){.  int c = m
1aec0 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1aed0 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32  2->z, pB1->n>pB2
1aee0 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70  ->n ? pB2->n : p
1aef0 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20  B1->n);.  if( c 
1af00 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1af10 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42  turn pB1->n - pB
1af20 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  2->n;.}.../*.** 
1af30 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1af40 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1af50 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1af60 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1af70 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1af80 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1af90 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1afa0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1afb0 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1afc0 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1afd0 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1afe0 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1aff0 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1b000 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1b010 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1b020 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1b030 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1b040 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1b050 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1b060 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1b070 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1b080 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1b090 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1b0a0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1b0b0 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1b0c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1b0d0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1b0e0 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1b0f0 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1b100 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1b110 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1b120 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1b130 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1b140 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1b150 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1b160 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1b170 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1b180 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1b190 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
1b1a0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
1b1b0 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1b1c0 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1b1d0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b1e0 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1b1f0 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1b200 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1b210 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1b220 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1b230 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1b240 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1b250 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1b260 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  l);.  }..  /* If
1b270 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
1b280 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f  number and the o
1b290 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65  ther is not, the
1b2a0 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e   number is less.
1b2b0 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1b2c0 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61  e numbers, compa
1b2d0 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f  re as reals if o
1b2e0 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72  ne is a real, or
1b2f0 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a   as integers.  *
1b300 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73  * if both values
1b310 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20   are integers.. 
1b320 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1b330 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1b340 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1b350 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32     double r1, r2
1b360 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
1b370 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1b380 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1b390 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1b3a0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1b3b0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1b3c0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1b3d0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b  >u.i ) return 1;
1b3e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1b3f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1b400 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1b410 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d  ){.      r1 = pM
1b420 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65  em1->u.r;.    }e
1b430 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f  lse if( (f1&MEM_
1b440 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1b450 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r1 = (double)pM
1b460 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65  em1->u.i;.    }e
1b470 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1b480 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1b490 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1b4a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
1b4b0 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20  = pMem2->u.r;.  
1b4c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 32 26    }else if( (f2&
1b4d0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1b4e0 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62 6c       r2 = (doubl
1b4f0 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20  e)pMem2->u.i;.  
1b500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b510 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1b520 20 20 20 20 69 66 28 20 72 31 3c 72 32 20 29 20      if( r1<r2 ) 
1b530 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1b540 66 28 20 72 31 3e 72 32 20 29 20 72 65 74 75 72  f( r1>r2 ) retur
1b550 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
1b560 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1b570 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1b580 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1b590 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1b5a0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1b5b0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1b5c0 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1b5d0 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1b5e0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1b5f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1b600 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1b610 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1b620 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1b630 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b640 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1b650 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1b660 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1b670 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1b680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1b690 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1b6a0 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  enc );.    asser
1b6b0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
1b6c0 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
1b6d0 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
1b6e0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1b6f0 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
1b700 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1b710 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
1b720 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1b730 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
1b740 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
1b750 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
1b760 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
1b770 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
1b780 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
1b790 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
1b7a0 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
1b7b0 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
1b7c0 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
1b7d0 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
1b7e0 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
1b7f0 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
1b800 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
1b810 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b820 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1b830 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
1b840 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
1b850 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
1b860 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
1b870 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
1b880 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
1b890 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
1b8a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
1b8b0 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
1b8c0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
1b8d0 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
1b8e0 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
1b8f0 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
1b900 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
1b910 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1b920 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
1b930 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
1b940 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
1b950 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1b960 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1b970 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
1b980 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1b990 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
1b9a0 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
1b9b0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
1b9c0 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
1b9d0 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
1b9e0 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
1b9f0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1ba00 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
1ba10 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
1ba20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
1ba30 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
1ba40 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1ba50 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
1ba60 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
1ba70 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
1ba80 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1ba90 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
1baa0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
1bab0 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
1bac0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1bad0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1bae0 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
1baf0 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
1bb00 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
1bb10 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1bb20 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
1bb30 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
1bb40 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1bb50 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1bb60 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
1bb70 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1bb80 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
1bb90 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1bba0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1bbb0 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
1bbc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1bbd0 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
1bbe0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1bbf0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1bc00 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
1bc10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1bc20 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
1bc30 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1bc40 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
1bc50 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1bc60 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
1bc70 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
1bc80 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
1bc90 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
1bca0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1bcb0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1bcc0 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
1bcd0 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1bce0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1bcf0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1bd00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bd10 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
1bd20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1bd30 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1bd40 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1bd50 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1bd60 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1bd70 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1bd80 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
1bd90 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
1bda0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
1bdb0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1bdc0 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
1bdd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1bde0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
1bdf0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
1be00 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
1be10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
1be20 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
1be30 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
1be40 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
1be50 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1be60 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
1be70 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
1be80 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
1be90 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1bea0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
1beb0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
1bec0 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
1bed0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
1bee0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1bef0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
1bf00 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
1bf10 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
1bf20 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
1bf30 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1bf40 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
1bf50 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
1bf60 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
1bf70 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
1bf80 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1bf90 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1bfa0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
1bfb0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1bfc0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1bfd0 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1bfe0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
1bff0 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
1c000 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
1c010 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
1c020 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
1c030 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
1c040 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
1c050 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
1c060 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
1c070 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
1c080 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1c090 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1c0a0 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
1c0b0 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1c0c0 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
1c0d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
1c0e0 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
1c0f0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
1c100 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
1c110 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1c120 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
1c130 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
1c140 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1c150 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
1c160 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
1c170 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c180 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
1c190 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20  fo->db)..*/.int 
1c1a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c1b0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1c1c0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1c1d0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1c1e0 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1c1f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1c200 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
1c210 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1c220 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1c250 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1c260 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1c270 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1c2a0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1c2b0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1c2c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1c2f0 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1c300 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1c310 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1c320 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c330 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1c340 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1c350 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c370 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1c380 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1c390 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1c3c0 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1c3d0 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1c3e0 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1c3f0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1c400 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1c410 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1c420 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1c430 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1c440 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1c450 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1c460 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1c470 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1c480 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1c490 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1c4a0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1c4b0 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1c4c0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1c4d0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1c4e0 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1c4f0 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1c500 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1c510 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1c520 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1c530 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1c540 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1c550 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1c560 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1c570 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1c580 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1c590 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1c5a0 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1c5b0 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1c5c0 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1c5d0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1c5e0 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1c5f0 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1c600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1c610 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1c620 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1c630 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1c640 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
1c650 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
1c660 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1c670 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1c680 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c690 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1c6a0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1c6b0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
1c6c0 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
1c6d0 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1c6e0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1c6f0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1c700 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1c710 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
1c720 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1c730 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65  ield+pPKey2->pKe
1c740 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1c750 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1c760 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1c770 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1c780 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1c790 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1c7a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c7b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c7c0 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1c7d0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1c7e0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1c7f0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1c800 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1c810 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1c820 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
1c830 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1c840 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
1c850 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1c860 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1c870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1c880 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1c890 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1c8a0 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1c8b0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1c8c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c8d0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1c8e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1c8f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1c900 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1c910 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  7 ){.        dou
1c920 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c  ble rhs = (doubl
1c930 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  e)pRhs->u.i;.   
1c940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c950 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1c960 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c970 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1c980 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c     if( mem1.u.r<
1c990 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c9a0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1c9b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
1c9c0 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20 20 20  .u.r>rhs ){.    
1c9d0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1c9e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c9f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1ca00 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1ca10 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1ca20 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1ca30 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1ca40 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1ca50 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1ca60 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1ca70 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1ca80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1ca90 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1caa0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1cab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1cad0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1cae0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1caf0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1cb00 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1cb10 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1cb20 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1cb30 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1cb40 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1cb50 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1cb60 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1cb70 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1cb80 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1cb90 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1cba0 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1cbb0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1cbc0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1cbd0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1cbe0 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1cbf0 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1cc00 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1cc10 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1cc20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1cc30 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1cc40 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1cc50 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1cc60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1cc70 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1cc80 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1cc90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cca0 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d      double rhs =
1ccb0 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20   pRhs->u.r;.    
1ccc0 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a      double lhs;.
1ccd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cce0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1ccf0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1cd00 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1cd10 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1cd20 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1cd30 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31        lhs = mem1
1cd40 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  .u.r;.        }e
1cd50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  lse{.          l
1cd60 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d  hs = (double)mem
1cd70 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d  1.u.i;.        }
1cd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1cd90 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1cda0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1cdb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1cdc0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1cdd0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1cde0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cdf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1ce00 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  s a string */.  
1ce10 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1ce20 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
1ce30 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1ce40 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1ce50 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1ce60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ce70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1ce80 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1ce90 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
1cea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1ceb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1cec0 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
1ced0 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1cee0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1cef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cf00 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61   mem1.n = (seria
1cf10 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1cf20 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1cf30 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d  se( (d1+mem1.n)=
1cf40 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1cf50 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1cf60 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1cf70 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1cf80 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1cf90 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20  if( (d1+mem1.n) 
1cfa0 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1cfb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1cfc0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1cfd0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1cfe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1cff0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d010 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1d020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d030 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1d040 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
1d050 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1d060 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  nfo->enc;.      
1d070 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b      mem1.db = pK
1d080 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1d090 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73        mem1.flags
1d0a0 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
1d0b0 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28        mem1.z = (
1d0c0 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
1d0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d0e0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1d0f0 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20  tring(.         
1d100 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73       &mem1, pRhs
1d110 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1d120 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65  l[i], &pPKey2->e
1d130 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  rrCode.         
1d140 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
1d150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1d160 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1d170 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1d180 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1d190 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1d1a0 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1d1b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d1c0 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1d1d0 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1d1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d1f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1d200 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1d210 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1d220 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1d230 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1d240 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1d250 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1d260 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1d270 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1d280 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1d290 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1d2a0 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1d2b0 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1d2c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1d2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d2e0 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1d2f0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1d300 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1d310 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1d320 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1d330 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1d340 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1d350 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1d360 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1d370 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1d380 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1d390 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1d3a0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1d3b0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1d3c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1d3d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1d3f0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1d400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d410 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1d420 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
1d430 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d440 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1d450 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1d460 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1d470 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
1d480 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
1d490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d4a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1d4b0 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
1d4c0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
1d4d0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1d4e0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
1d4f0 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
1d500 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
1d510 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1d520 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1d530 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1d540 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d550 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1d560 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
1d570 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1d580 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1d590 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
1d5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1d5b0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d5c0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1d5d0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1d5e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d5f0 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1d600 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1d610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d620 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1d630 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1d640 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1d650 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1d660 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1d670 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1d680 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1d690 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1d6a0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1d6b0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1d6c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1d6d0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1d6e0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1d6f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1d700 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1d710 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1d720 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1d730 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1d740 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1d750 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1d760 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1d770 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1d780 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1d790 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1d7a0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1d7b0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1d7c0 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1d7d0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1d7e0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1d7f0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1d800 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1d810 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1d820 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1d830 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
1d840 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1d850 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
1d860 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1d870 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1d880 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
1d890 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
1d8a0 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
1d8b0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1d8c0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
1d8d0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1d8e0 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
1d8f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1d900 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
1d910 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1d920 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1d930 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1d940 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1d950 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1d960 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
1d970 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1d980 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1d990 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1d9a0 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
1d9b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1d9c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1d9d0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1d9e0 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1d9f0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
1da00 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
1da10 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
1da20 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
1da30 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
1da40 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
1da50 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
1da60 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1da70 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1da80 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
1da90 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
1daa0 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
1dab0 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
1dac0 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
1dad0 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
1dae0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
1daf0 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
1db00 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
1db10 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
1db20 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
1db30 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
1db40 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1db50 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
1db60 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1db70 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1db80 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1db90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1dba0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
1dbb0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
1dbc0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
1dbd0 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
1dbe0 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
1dbf0 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
1dc00 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
1dc10 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
1dc20 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
1dc30 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
1dc40 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
1dc50 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65   v = pPKey2->aMe
1dc60 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20  m[0].u.i;.  i64 
1dc70 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
1dc80 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1dc90 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
1dca0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
1dcb0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
1dcc0 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
1dcd0 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
1dce0 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
1dcf0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1dd00 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
1dd10 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
1dd20 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1dd30 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
1dd40 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1dd50 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1dd60 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1dd70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dd80 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1dd90 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1dda0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
1ddb0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1ddc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ddd0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1dde0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ddf0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1de00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1de10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1de20 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
1de30 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1de40 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1de50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1de60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1de70 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1de80 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1de90 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1dea0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1deb0 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
1dec0 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1ded0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1dee0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1def0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1df00 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1df10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1df20 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
1df30 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1df40 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1df50 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1df60 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1df70 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1df80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1df90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1dfa0 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
1dfb0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1dfc0 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
1dfd0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1dfe0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1dff0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1e000 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1e010 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
1e020 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
1e030 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1e040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e050 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
1e060 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
1e070 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1e080 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
1e090 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1e0a0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1e0b0 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
1e0c0 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
1e0d0 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
1e0e0 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
1e0f0 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
1e100 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
1e110 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
1e120 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
1e130 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1e140 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
1e150 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
1e160 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
1e170 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
1e180 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
1e190 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
1e1a0 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
1e1b0 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
1e1c0 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
1e1d0 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
1e1e0 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
1e1f0 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
1e200 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
1e210 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
1e220 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
1e230 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
1e240 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
1e250 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e260 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e270 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1e280 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
1e290 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1e2a0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1e2b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1e2c0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1e2d0 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  2);.  }..  if( v
1e2e0 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1e2f0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1e300 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1e310 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1e320 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1e330 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1e340 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1e350 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1e360 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1e370 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1e380 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1e390 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1e3a0 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
1e3b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1e3c0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1e3d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e3e0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
1e3f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
1e400 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1e410 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1e420 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
1e430 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
1e440 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
1e450 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1e460 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
1e470 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
1e480 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1e490 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  lt_rc;.  }..  as
1e4a0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1e4b0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1e4c0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1e4d0 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
1e4e0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1e4f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e500 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1e510 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1e520 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e530 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1e540 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1e550 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1e560 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
1e570 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
1e580 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
1e590 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e5a0 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
1e5b0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
1e5c0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1e5d0 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
1e5e0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1e5f0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1e600 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
1e610 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1e620 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
1e630 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1e640 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1e650 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1e660 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1e670 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1e680 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1e690 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
1e6a0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
1e6b0 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
1e6c0 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
1e6d0 20 72 65 73 3b 0a 0a 20 20 76 64 62 65 41 73 73   res;..  vdbeAss
1e6e0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1e6f0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
1e700 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
1e710 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
1e720 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1e730 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1e740 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
1e750 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
1e760 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
1e770 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
1e780 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
1e790 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
1e7a0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1e7b0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1e7c0 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
1e7d0 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
1e7e0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1e7f0 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1e800 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
1e810 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
1e820 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
1e830 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
1e840 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
1e850 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
1e860 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
1e870 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
1e880 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1e890 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1e8a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e8b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1e8c0 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
1e8d0 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
1e8e0 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
1e8f0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
1e900 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
1e910 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
1e920 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
1e930 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
1e940 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
1e950 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
1e960 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
1e970 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
1e980 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1e990 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
1e9a0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
1e9b0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
1e9c0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e9d0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
1e9e0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1e9f0 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
1ea00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ea10 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1ea20 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
1ea30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1ea40 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1ea50 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1ea60 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
1ea70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1ea80 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1ea90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1eaa0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1eab0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1eac0 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
1ead0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1eae0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
1eaf0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
1eb00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1eb10 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1eb20 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
1eb30 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1eb40 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
1eb50 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1eb60 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1eb70 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
1eb80 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
1eb90 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1eba0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
1ebb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1ebc0 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
1ebd0 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
1ebe0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
1ebf0 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
1ec00 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
1ec10 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
1ec20 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
1ec30 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
1ec40 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
1ec50 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
1ec60 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1ec70 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
1ec80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1ec90 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
1eca0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1ecb0 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
1ecc0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
1ecd0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1ece0 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
1ecf0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
1ed00 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
1ed10 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1ed20 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
1ed30 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
1ed40 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1ed50 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
1ed60 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
1ed70 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
1ed80 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
1ed90 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
1eda0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
1edb0 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
1edc0 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
1edd0 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
1ede0 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
1edf0 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
1ee00 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
1ee10 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
1ee20 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
1ee30 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
1ee40 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
1ee50 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1ee60 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
1ee70 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
1ee80 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
1ee90 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
1eea0 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
1eeb0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
1eec0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
1eed0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
1eee0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
1eef0 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
1ef00 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
1ef10 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
1ef20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
1ef30 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
1ef40 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
1ef50 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
1ef60 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
1ef70 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
1ef80 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
1ef90 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
1efa0 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
1efb0 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
1efc0 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
1efd0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
1efe0 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
1eff0 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
1f000 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
1f010 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
1f020 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
1f030 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
1f040 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
1f050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f060 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
1f070 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
1f080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1f090 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
1f0a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1f0b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f0c0 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
1f0d0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1f0e0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
1f0f0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1f100 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
1f110 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1f120 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
1f130 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1f140 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
1f150 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
1f160 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
1f170 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
1f180 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f190 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1f1a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f1b0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1f1c0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
1f1d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
1f1e0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f1f0 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
1f200 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
1f210 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
1f220 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
1f230 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1f240 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
1f250 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
1f260 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
1f270 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
1f280 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
1f290 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1f2a0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1f2b0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
1f2c0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1f2d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
1f2e0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
1f2f0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
1f300 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
1f310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1f320 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
1f330 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
1f340 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
1f350 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
1f360 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
1f370 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
1f380 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
1f390 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
1f3a0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
1f3b0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
1f3c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1f3d0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
1f3e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f3f0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
1f400 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
1f410 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
1f420 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
1f430 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
1f440 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f450 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
1f460 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
1f470 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f480 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
1f490 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
1f4a0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
1f4b0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
1f4c0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
1f4d0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
1f4e0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1f4f0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
1f500 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
1f510 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
1f520 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
1f530 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
1f540 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
1f550 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
1f560 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
1f570 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
1f580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f590 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1f5a0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
1f5b0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
1f5c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1f5d0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
1f5e0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
1f5f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
1f600 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
1f610 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
1f620 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
1f630 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
1f640 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
1f650 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
1f660 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
1f670 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
1f680 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
1f690 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1f6a0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
1f6b0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
1f6c0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
1f6d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
1f6e0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
1f6f0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
1f700 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
1f710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1f720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
1f730 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
1f740 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
1f750 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
1f760 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1f770 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
1f780 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
1f790 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
1f7a0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
1f7b0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1f7c0 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
1f7d0 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
1f7e0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1f7f0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1f800 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
1f810 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
1f820 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
1f830 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
1f840 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
1f850 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
1f860 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
1f870 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
1f880 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
1f890 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
1f8a0 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
1f8b0 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
1f8c0 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
1f8d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f8e0 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
1f8f0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f900 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
1f910 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f920 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
1f930 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
1f940 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f950 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
1f960 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f970 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
1f980 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f990 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
1f9a0 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
1f9b0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
1f9c0 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
1f9d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
1f9e0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1f9f0 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
1fa00 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
1fa10 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77  ypeSizes[typeRow
1fa20 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id];.  testcase(
1fa30 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
1fa40 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
1fa50 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
1fa60 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
1fa70 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
1fa80 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
1fa90 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
1faa0 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
1fab0 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
1fac0 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
1fad0 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
1fae0 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
1faf0 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
1fb00 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
1fb10 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
1fb20 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
1fb30 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1fb40 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1fb50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
1fb60 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
1fb70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1fb80 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
1fb90 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
1fba0 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
1fbb0 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
1fbc0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1fbd0 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
1fbe0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1fbf0 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
1fc00 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b  m.szMalloc!=0 );
1fc10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1fc20 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1fc30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fc40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
1fc50 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1fc60 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
1fc70 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
1fc80 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
1fc90 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
1fca0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
1fcb0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
1fcc0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
1fcd0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
1fce0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
1fcf0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1fd00 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
1fd10 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
1fd20 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1fd30 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
1fd40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1fd50 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
1fd60 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
1fd70 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
1fd80 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
1fd90 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
1fda0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
1fdb0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
1fdc0 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
1fdd0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1fde0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
1fdf0 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
1fe00 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
1fe10 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
1fe20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
1fe30 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
1fe40 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
1fe50 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
1fe60 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
1fe70 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
1fe80 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
1fe90 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
1fea0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
1feb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1fec0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1fed0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
1fee0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
1fef0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1ff00 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
1ff10 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
1ff20 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
1ff30 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55  cked,       /* U
1ff40 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
1ff50 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  of key */.  int 
1ff60 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff80 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
1ff90 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
1ffa0 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
1ffb0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
1ffc0 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
1ffd0 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
1ffe0 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  sor;.  Mem m;.. 
1fff0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20000 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
20010 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
20020 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
20030 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
20040 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
20050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
20060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
20070 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
20080 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
20090 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
200a0 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
200b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
200c0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
200d0 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
200e0 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a   of the way.  **
200f0 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
20100 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
20110 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
20120 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
20130 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
20140 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
20150 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
20160 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
20170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20180 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20190 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
201a0 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
201b0 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
201c0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
201d0 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
201e0 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
201f0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
20200 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
20210 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
20220 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
20230 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
20240 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
20250 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
20260 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
20270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20280 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
20290 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
202a0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
202b0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
202c0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
202d0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
202e0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
202f0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
20300 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20310 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
20320 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
20330 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
20340 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20350 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
20360 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
20370 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
20380 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
20390 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
203a0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
203b0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
203c0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
203d0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
203e0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
203f0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
20400 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
20410 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
20420 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
20430 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
20440 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
20450 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
20460 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
20470 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
20480 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
20490 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
204a0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
204b0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
204c0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
204d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
204e0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
204f0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
20500 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
20510 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
20520 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
20530 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
20540 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
20550 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
20560 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
20570 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
20580 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
20590 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
205a0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
205b0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
205c0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
205d0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
205e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
205f0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
20600 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
20610 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
20620 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
20630 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
20640 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
20650 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
20660 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20670 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
20680 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
20690 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
206a0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
206b0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
206c0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
206d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
206e0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
206f0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
20700 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
20710 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
20720 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
20730 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
20740 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
20750 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
20760 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
20770 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
20780 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
20790 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
207a0 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
207b0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
207c0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
207d0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
207e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
207f0 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
20800 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
20810 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
20820 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
20830 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
20840 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
20850 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
20860 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
20870 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
20880 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
20890 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
208a0 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
208b0 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
208c0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
208d0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
208e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
208f0 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
20900 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
20910 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
20920 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20930 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
20940 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
20950 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20960 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
20970 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
20980 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
20990 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
209a0 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
209b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
209c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
209d0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
209e0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
209f0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
20a00 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
20a10 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
20a20 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
20a30 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
20a40 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
20a50 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
20a60 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
20a70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
20a80 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
20a90 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
20aa0 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
20ab0 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
20ac0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
20ad0 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
20ae0 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
20af0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
20b00 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
20b10 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ));.  }.}..#ifnd
20b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
20b30 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
20b40 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
20b50 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
20b60 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
20b70 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
20b80 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
20b90 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
20ba0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
20bb0 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
20bc0 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
20bd0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
20be0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
20bf0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
20c00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20c10 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
20c20 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
20c30 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
20c40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20c50 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  p->db;.  sqlite3
20c60 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
20c70 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
20c80 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
20c90 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
20ca0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  ->zErrMsg);.  sq
20cb0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
20cc0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
20cd0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
20ce0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
20cf0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
20d00 4c 54 41 42 4c 45 20 2a 2f 0a                    LTABLE */.