/ Hex Artifact Content
Login

Artifact 68082d9991fc1b8625d34c8b5db1775c9dee426e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e    return p ? p->
0740: 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zSql : 0;.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
08e0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08f0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0900: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0910: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0920: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0930: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0940: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0950: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0960: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
0970: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
0980: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
0990: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09b0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09c0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09e0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a00: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a10: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a20: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a30: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a50: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a60: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0ac0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0ad0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0ae0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0af0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b00: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b10: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b20: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b40: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b50: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b60: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0b70: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0b80: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0b90: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0ba0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0bb0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bc0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0bd0: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0be0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0bf0: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c00: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c10: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c20: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c30: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c40: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c50: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c60: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0c70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c80: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0c90: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0ca0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0cb0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cc0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0cd0: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0ce0: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d10: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d20: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d40: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d50: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d60: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0d70: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d80: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0d90: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0da0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0db0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0dc0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0dd0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0de0: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0df0: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e00: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e20: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e30: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e50: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0e70: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0e80: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0e90: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0eb0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0ed0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0ee0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0ef0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f00: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f10: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f20: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f30: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f40: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f50: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f60: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0f70: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0f80: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0f90: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fa0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fb0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0fc0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
0fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0fe0: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
0ff0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1000: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1010: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1020: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1030: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1040: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1050: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1060: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1070: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1080: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1090: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10c0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
10d0: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
10e0: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
10f0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1100: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1110: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1120: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1130: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1150: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1160: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1170: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1180: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1190: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
11a0: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
11b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
11c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
11d0: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
11e0: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
11f0: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b  Alloc<=p->nOp );
1200: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72  .  if( growOpArr
1210: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72  ay(p, 1) ) retur
1220: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
1230: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1240: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
1250: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1260: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1270: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1280: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1290: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
12a0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
12b0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
12c0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
12d0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
12e0: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
12f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1300: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1310: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
1320: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
1330: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1340: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74  oc<=i ){.    ret
1350: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f  urn growOp3(p, o
1360: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1370: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
1380: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
1390: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
13a0: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
13b0: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
13c0: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
13d0: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
13e0: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
13f0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
1400: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
1410: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
1420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
1430: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
1440: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1470: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
1480: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1490: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14a0: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
14b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
14c0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
14d0: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
14e0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14f0: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1500: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1510: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
1520: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
1530: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
1540: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1550: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
1560: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1570: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1580: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1590: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
15a0: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
15b0: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
15c0: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
15d0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
15e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
15f0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1600: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
1610: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
1620: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1630: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1640: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1650: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1660: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1670: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1680: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1690: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
16a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
16b0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
16c0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
16d0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
16e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
16f0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1700: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1710: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1720: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1730: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1750: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1760: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
17a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17b0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17c0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
17d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17e0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
17f0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
1800: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
1810: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1820: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1830: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1840: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1850: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1860: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1870: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1880: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1890: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
18a0: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
18b0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
18c0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
18d0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
18e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
18f0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1900: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
1910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1920: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1930: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1940: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1950: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1960: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1970: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1980: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1990: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
19a0: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
19b0: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
19c0: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
19d0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
19e0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
19f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1a00: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1a10: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1a20: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1a30: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1a40: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1a50: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1a60: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1a70: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1a80: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1a90: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1aa0: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1ab0: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1ac0: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ad0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1ae0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1af0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1b10: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62  dbeMultiLoad(Vdb
1b20: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b40: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  pes, ...){.  va_
1b50: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69  list ap;.  int i
1b60: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61  ;.  char c;.  va
1b70: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65  _start(ap, zType
1b80: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  s);.  for(i=0; (
1b90: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d  c = zTypes[i])!=
1ba0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
1bb0: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20   c=='s' ){.     
1bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1bd0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1be0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1bf0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1c00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20  e3VdbeAddOp2(p, 
1c10: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a  z==0 ? OP_Null :
1c20: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1c30: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 20 20  iDest++);.      
1c40: 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 33 56  if( z ) sqlite3V
1c50: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1c60: 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  ddr, z, 0);.    
1c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c80: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ca0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cb0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cc0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1ce0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1cf0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d00: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d10: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d20: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d40: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d60: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d70: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d80: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d90: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1da0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dc0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1dd0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1df0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e00: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e10: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e30: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e40: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e50: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e60: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e70: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e80: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1e90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1ea0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ec0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ed0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ee0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f00: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f10: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f20: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f30: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f40: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f50: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f60: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f80: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1f90: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fc0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fe0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1ff0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2000: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2010: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2020: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2030: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2040: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2050: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2060: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2070: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2080: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2090: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20c0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20d0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20e0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
20f0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2110: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2120: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2130: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2140: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2150: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2160: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2170: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2180: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2190: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21a0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21b0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21c0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21d0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
21f0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2200: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2210: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2220: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2240: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2250: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2260: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2280: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
2290: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22a0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22b0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
22c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
22d0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
22e0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
22f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2310: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
2320: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
2330: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
2340: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
2350: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
2360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
2370: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2380: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2390: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
23a0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
23d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
23e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
23f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
2420: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2440: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2450: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2460: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2470: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2490: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
24a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
24d0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
24e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
24f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
2500: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
2510: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2520: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
2530: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2540: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
2550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2570: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2580: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2590: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
25a0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
25b0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
25c0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
25d0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
25e0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
25f0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2600: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2610: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2620: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2630: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2640: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2650: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2660: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2670: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2680: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2690: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
26a0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
26b0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
26c0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
26d0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
26e0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
26f0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2700: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2710: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2720: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2730: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2740: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2750: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2760: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2770: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2780: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2790: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
27a0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
27b0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
27c0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
27d0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
27f0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
2800: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2810: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2820: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
2830: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2840: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2850: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
2860: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
2870: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
2880: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2890: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
28a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
28e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
28f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
2900: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
2910: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
2920: 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52 28  }.  return ADDR(
2930: 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  i);.}../*.** Res
2940: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
2950: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
2960: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2970: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
2980: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
2990: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
29a0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
29b0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
29c0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
29d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
29e0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
29f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2a00: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
2a10: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
2a20: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
2a30: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
2a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
2a50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2a60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
2a70: 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20  rt( j<p->nLabel 
2a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
2a90: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  0 );.  if( p->aL
2aa0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2ab0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
2ac0: 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69 78  p;.  }.  p->iFix
2ad0: 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20  edOp = v->nOp - 
2ae0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
2af0: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
2b00: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
2b10: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
2b20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2b30: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
2b40: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
2b50: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
2b60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2b70: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
2b80: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2b90: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
2ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2bb0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
2bc0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
2bd0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
2be0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2bf0: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2c00: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2c10: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2c20: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2c30: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2c40: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2c50: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2c60: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2c70: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2c80: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
2c90: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
2ca0: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
2cb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2cc0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
2cd0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2d00: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
2d10: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2d20: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
2d30: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
2d40: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
2d50: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
2d60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2d70: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
2d80: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
2d90: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
2da0: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
2db0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
2dc0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
2df0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
2e00: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
2e10: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
2e20: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
2e30: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
2e40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2e70: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
2e80: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2eb0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2ec0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
2ed0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
2ef0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
2f00: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
2f10: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
2f20: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
2f30: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
2f40: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
2f50: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
2f60: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
2f70: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
2f80: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
2f90: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
2fa0: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
2fb0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
2fc0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
2fd0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
2fe0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
2ff0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
3000: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
3010: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3020: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
3030: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
3040: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
3050: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
3060: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
3070: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
3080: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
3090: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
30a0: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
30b0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
30c0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
30d0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
30e0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
30f0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
3100: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
3110: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
3120: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
3130: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
3140: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
3150: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
3160: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
3170: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
3180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3190: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
31a0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
31b0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
31c0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
31d0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
31e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
31f0: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
3200: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
3210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3220: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
3230: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
3240: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
3250: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3260: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
3270: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3280: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
3290: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
32a0: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
32b0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
32c0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
32d0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
32e0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
32f0: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
3300: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
3310: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
3320: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
3330: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
3340: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
3350: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
3360: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
3370: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
3380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
3390: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
33a0: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
33b0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
33c0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
33d0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
33e0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
33f0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
3400: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
3410: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
3420: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
3430: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
3440: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
3450: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
3460: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
3470: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3480: 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20  traint).**   *  
3490: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 61  OP_CreateTable a
34a0: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  nd OP_InitCorout
34b0: 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45 20  ine (for CREATE 
34c0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
34d0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
34e0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
34f0: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
3500: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
3510: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
3520: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
3530: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3540: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3550: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
3560: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3570: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
3580: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
3590: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
35a0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
35b0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
35c0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
35d0: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
35e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35f0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
3600: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
3610: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
3620: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
3630: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
3640: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
3650: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
3660: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
3670: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
3680: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
3690: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
36a0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
36b0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
36c0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
36d0: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
36e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
36f0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
3700: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
3710: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
3720: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3730: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
3740: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
3750: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
3760: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3770: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
3780: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
3790: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
37a0: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28 28  name .     || ((
37b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
37c0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
37d0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
37e0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
37f0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
3800: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
3810: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
3820: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
3830: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
3840: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3850: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  if( opcode==OP_C
3860: 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61 73  reateTable ) has
3870: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31 3b  CreateTable = 1;
3880: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3890: 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e  =OP_InitCoroutin
38a0: 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  e ) hasInitCorou
38b0: 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65  tine = 1;.#ifnde
38c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
38d0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66  REIGN_KEY.    if
38e0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43  ( opcode==OP_FkC
38f0: 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70  ounter && pOp->p
3900: 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d  1==0 && pOp->p2=
3910: 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73 46  =1 ){.      hasF
3920: 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20  kCounter = 1;.  
3930: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
3940: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
3950: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
3960: 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  b);..  /* Return
3970: 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72   true if hasAbor
3980: 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20  t==mayAbort. Or 
3990: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
39a0: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
39b0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ** If malloc fai
39c0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68  led, then the wh
39d0: 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65  ile() loop above
39e0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74   may not have it
39f0: 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f  erated.  ** thro
3a00: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ugh all opcodes 
3a10: 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79  and hasAbort may
3a20: 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63   be set incorrec
3a30: 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a  tly. Return.  **
3a40: 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63   true for this c
3a50: 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ase to prevent t
3a60: 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74  he assert() in t
3a70: 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65  he callers frame
3a80: 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69  .  ** from faili
3a90: 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ng.  */.  return
3aa0: 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63   ( v->db->malloc
3ab0: 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f  Failed || hasAbo
3ac0: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20  rt==mayAbort || 
3ad0: 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20  hasFkCounter.   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 68             || (h
3af0: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26 26  asCreateTable &&
3b00: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
3b10: 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e) );.}.#endif /
3b20: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
3b30: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
3b40: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
3b50: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
3b60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3b70: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
3b80: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
3b90: 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49 74  en inserted.  It
3ba0: 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67   loops.** throug
3bb0: 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65  h all the opcode
3bc0: 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20 73  s and fixes up s
3bd0: 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  ome details..**.
3be0: 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68 20  ** (1) For each 
3bf0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
3c00: 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76 65   with a negative
3c10: 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61 62   P2 value (a lab
3c20: 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c  el).**     resol
3c30: 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ve the P2 value 
3c40: 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64 64  to an actual add
3c50: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20  ress..**.** (2) 
3c60: 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78 69  Compute the maxi
3c70: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
3c80: 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20  guments used by 
3c90: 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  any SQL function
3ca0: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f 72  .**     and stor
3cb0: 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20  e that value in 
3cc0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a  *pMaxFuncArgs..*
3cd0: 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65 20  *.** (3) Update 
3ce0: 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c  the Vdbe.readOnl
3cf0: 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52 65  y and Vdbe.bIsRe
3d00: 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61 63  ader flags to ac
3d10: 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  curately.**     
3d20: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
3d30: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
3d40: 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64 6f  ment actually do
3d50: 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e  es..**.** (4) In
3d60: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34 2e  itialize the p4.
3d70: 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72  xAdvance pointer
3d80: 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61 74   on opcodes that
3d90: 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28   use it..**.** (
3da0: 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  5) Reclaim the m
3db0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
3dc0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62 65  for storing labe
3dd0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
3de0: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
3df0: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
3e00: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
3e10: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3e20: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
3e30: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
3e40: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
3e50: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
3e60: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
3e70: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
3e80: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
3e90: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
3ea0: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
3eb0: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
3ec0: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
3ed0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
3ee0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3ef0: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
3f00: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
3f10: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
3f20: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
3f30: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
3f40: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
3f50: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
3f60: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
3f70: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
3f80: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b  P_Transaction: {
3f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
3fa0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
3fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3fc0: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
3fd0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
3fe0: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
3ff0: 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  mit:.      case 
4000: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
4010: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
4020: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
4030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4050: 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63  OMIT_WAL.      c
4060: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
4070: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
4080: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
4090: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f        case OP_Jo
40a0: 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20  urnalMode: {.   
40b0: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
40c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
40d0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
40e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
40f0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4110: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61  ALTABLE.      ca
4120: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
4130: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
4140: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
4150: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
4160: 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
4170: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4180: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
4190: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
41a0: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
41b0: 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d  t( p->nOp - i >=
41c0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73   3 );.        as
41d0: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
41e0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
41f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   );.        n = 
4200: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
4210: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
4220: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
4230: 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  n;.        break
4240: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
4250: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  .      case OP_N
4260: 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ext:.      case 
4270: 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20  OP_NextIfOpen:. 
4280: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72       case OP_Sor
4290: 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20  terNext: {.     
42a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
42b0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
42c0: 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  eeNext;.        
42d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
42e0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
42f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4300: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50  .      case OP_P
4310: 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20  rev:.      case 
4320: 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b  OP_PrevIfOpen: {
4330: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
4340: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
4350: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
4360: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
4370: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
4380: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
4390: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
43a0: 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61  ..    pOp->opfla
43b0: 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  gs = sqlite3Opco
43c0: 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64  deProperty[opcod
43d0: 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70  e];.    if( (pOp
43e0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
43f0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
4400: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
4410: 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f   assert( ADDR(pO
4420: 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e  p->p2)<pParse->n
4430: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
4440: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
4450: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
4460: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4470: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
4480: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29   pParse->aLabel)
4490: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  ;.  pParse->aLab
44a0: 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  el = 0;.  pParse
44b0: 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->nLabel = 0;.  
44c0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
44d0: 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65  nMaxArgs;.  asse
44e0: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
44f0: 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c  !=0 || DbMaskAll
4500: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
4510: 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  k) );.}../*.** R
4520: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
4530: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
4540: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4550: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
4560: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4570: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
4580: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
4590: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
45a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
45b0: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
45c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
45d0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
45e0: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
45f0: 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63  of opcodes assoc
4600: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
4610: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
4620: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4630: 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63  ent. It is the c
4640: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
4650: 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61  ility.** to arra
4660: 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  nge for the retu
4670: 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65  rned array to be
4680: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
4690: 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  d using the .** 
46a0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
46b0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
46c0: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
46d0: 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74  ng, *pnOp is set
46e0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
46f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4700: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72   returned.** arr
4710: 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78  ay. Also, *pnMax
4720: 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  Arg is set to th
4730: 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20  e larger of its 
4740: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
4750: 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  d .** the number
4760: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4770: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
4780: 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74  array required t
4790: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a  o execute the .*
47a0: 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72  * returned progr
47b0: 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  am..*/.VdbeOp *s
47c0: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
47d0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
47e0: 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70  nt *pnOp, int *p
47f0: 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65  nMaxArg){.  Vdbe
4800: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
4810: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20  ;.  assert( aOp 
4820: 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  && !p->db->mallo
4830: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a  cFailed );..  /*
4840: 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69   Check that sqli
4850: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4860: 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
4870: 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a  d on this VM */.
4880: 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
4890: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
48a0: 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f  Mask) );..  reso
48b0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
48c0: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
48d0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
48e0: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
48f0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
4900: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
4910: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
4920: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
4930: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
4940: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
4950: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
4960: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
4970: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
4980: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
4990: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
49a0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
49b0: 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a  , int iLineno){.
49c0: 20 20 69 6e 74 20 61 64 64 72 2c 20 69 3b 0a 20    int addr, i;. 
49d0: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 3b 0a 20   VdbeOp *pOut;. 
49e0: 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29   assert( nOp>0 )
49f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4a00: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4a10: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4a20: 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d  ->nOp + nOp > p-
4a30: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
4a40: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
4a50: 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20  (p, nOp) ){.    
4a60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4a70: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
4a80: 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b   pOut = &p->aOp[
4a90: 61 64 64 72 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  addr];.  for(i=0
4aa0: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f  ; i<nOp; i++, aO
4ab0: 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20  p++, pOut++){.  
4ac0: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
4ad0: 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   aOp->opcode;.  
4ae0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70    pOut->p1 = aOp
4af0: 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p1;.    pOut->
4b00: 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = aOp->p2;.  
4b10: 20 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70    assert( aOp->p
4b20: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74  2>=0 );.    pOut
4b30: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a  ->p3 = aOp->p3;.
4b40: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
4b50: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
4b60: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
4b70: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  0;.    pOut->p5 
4b80: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
4b90: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
4ba0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70  N_COMMENTS.    p
4bb0: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
4bc0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
4bd0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
4be0: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e  ERAGE.    pOut->
4bf0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4c00: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4c10: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
4c20: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4c30: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
4c40: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
4c50: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
4c60: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
4c70: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4c80: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
4c90: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
4ca0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
4cb0: 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70  .  p->nOp += nOp
4cc0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
4cd0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4ce0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4cf0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4d00: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4d10: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4d20: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
4d30: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
4d40: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
4d50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4d60: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
4d70: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4da0: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4db0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4dc0: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4dd0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4de0: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4df0: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4e00: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4e20: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
4e30: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
4e40: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
4e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4e60: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
4e70: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
4e80: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4eb0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4ec0: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4ed0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4ef0: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4f00: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4f10: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4f20: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
4f30: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
4f40: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
4f50: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
4f60: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
4f70: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
4f80: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
4f90: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4fa0: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4fb0: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4fc0: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4fd0: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4fe0: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4ff0: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
5000: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
5010: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
5020: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
5030: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
5040: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
5050: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
5060: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
5070: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
5080: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
5090: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
50a0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
50b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
50c0: 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50  the opcode, or P
50d0: 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35  1, P2, P3, or P5
50e0: 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72   operands.** for
50f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
5100: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5110: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5120: 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  geOpcode(Vdbe *p
5130: 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69  , u32 addr, u8 i
5140: 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71  NewOpcode){.  sq
5150: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5160: 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d  ,addr)->opcode =
5170: 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76   iNewOpcode;.}.v
5180: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5190: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
51a0: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
51b0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
51c0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
51d0: 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p1 = val;.}.voi
51e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
51f0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
5200: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
5210: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5220: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5230: 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  2 = val;.}.void 
5240: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5250: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
5260: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
5270: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
5280: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20  tOp(p,addr)->p3 
5290: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
52a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
52b0: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 70 35  5(Vdbe *p, u8 p5
52c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
52d0: 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e 70 35 20  GetOp(p,-1)->p5 
52e0: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
52f0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
5300: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
5310: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
5320: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
5330: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
5340: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
5350: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
5360: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5370: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
5380: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
5390: 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  {.  p->pParse->i
53a0: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
53b0: 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 56   - 1;.  sqlite3V
53c0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
53d0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
53e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
53f0: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
5400: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
5410: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
5420: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
5430: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
5440: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
5450: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
5460: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
5470: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
5480: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
5490: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
54a0: 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20  ALWAYS(pDef) && 
54b0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
54c0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
54d0: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
54e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
54f0: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
5500: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
5510: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
5520: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
5530: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
5540: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
5550: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
5560: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
5570: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
5580: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
5590: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
55a0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29      assert( db )
55b0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  ;.    switch( p4
55c0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
55d0: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
55e0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
55f0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
5600: 62 2c 20 28 28 73 71 6c 69 74 65 33 5f 63 6f 6e  b, ((sqlite3_con
5610: 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 75 6e 63  text*)p4)->pFunc
5620: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  );.        /* Fa
5630: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
5640: 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f  the next case */
5650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5660: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
5670: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
5680: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
5690: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63  DYNAMIC:.      c
56a0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
56b0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
56c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
56d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
56e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
56f0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
5700: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5710: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5720: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
5730: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
5740: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
5760: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5770: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
5780: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 45 58        case P4_EX
5790: 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  PR: {.        sq
57a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
57b0: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
57c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
57d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
57e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49      case P4_MPRI
57f0: 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  NTF: {.        i
5800: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
5810: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
5820: 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20  _free(p4);.     
5830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5840: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
5850: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
5860: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
5870: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75  Function(db, (Fu
5880: 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20  ncDef*)p4);.    
5890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
58a0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
58b0: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  _MEM: {.        
58c0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
58d0: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
58e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
58f0: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
5900: 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20  alue*)p4);.     
5910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5920: 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65      Mem *p = (Me
5930: 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20  m*)p4;.         
5940: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
5950: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
5960: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
5970: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5980: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
5990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
59a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
59b0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
59c0: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
59d0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
59e0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
59f0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
5a00: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
5a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
5a30: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
5a40: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
5a50: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
5a60: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
5a70: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
5a80: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
5a90: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
5aa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
5ab0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
5ac0: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
5ad0: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
5ae0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
5af0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
5b00: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
5b10: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
5b20: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
5b30: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
5b40: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
5b50: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
5b60: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5b70: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5b80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
5b90: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
5ba0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
5bb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5bc0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
5bd0: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
5be0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
5bf0: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
5c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
5c10: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
5c20: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
5c30: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
5c40: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
5c50: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
5c60: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
5c70: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
5c80: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
5c90: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
5ca0: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
5cb0: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
5cc0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
5cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
5ce0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
5cf0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
5d00: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
5d10: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
5d20: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
5d30: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
5d40: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5d50: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
5d60: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
5d70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5d80: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
5d90: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
5da0: 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d 3e 6e  .  if( addr<p->n
5db0: 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  Op ){.    VdbeOp
5dc0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
5dd0: 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74  addr];.    sqlit
5de0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5df0: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70      freeP4(db, p
5e00: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
5e10: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73  >p4.p);.    mems
5e20: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
5e30: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
5e40: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
5e50: 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _Noop;.  }.}../*
5e60: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
5e70: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
5e80: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
5e90: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
5ea0: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
5eb0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
5ec0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
5ed0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
5ee0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
5ef0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
5f00: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
5f10: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
5f20: 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d  ( (p->nOp-1)>(p-
5f30: 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f  >pParse->iFixedO
5f40: 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  p) && p->aOp[p->
5f50: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
5f60: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
5f70: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
5f80: 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20  (p, p->nOp-1);. 
5f90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5fa0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5fb0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
5fc0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
5fd0: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
5fe0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
5ff0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
6000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6010: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
6020: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
6030: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
6040: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
6050: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
6060: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
6070: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
6080: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
6090: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
60a0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
60b0: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
60c0: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
60d0: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
60e0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
60f0: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
6100: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
6110: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
6120: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
6130: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
6140: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
6150: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
6160: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
6170: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
6180: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
6190: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
61a0: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
61b0: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
61c0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
61d0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
61e0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
61f0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
6200: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
6210: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
6220: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
6230: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
6240: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
6250: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
6260: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
6270: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
6280: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
6290: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
62a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
62b0: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
62c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
62d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
62e0: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
62f0: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
6300: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
6310: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
6320: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
6330: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
6340: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
6350: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6360: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6370: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
6380: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
6390: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
63a0: 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20  !=P4_VTAB ){.   
63b0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c     freeP4(db, n,
63c0: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
63d0: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
63e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
63f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
6410: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
6420: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
6430: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
6440: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
6450: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
6460: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
6470: 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44  type==P4_NOTUSED
6480: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
6490: 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
64a0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
64b0: 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e  p4type==P4_KEYIN
64c0: 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64  FO );.  freeP4(d
64d0: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
64e0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
64f0: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69  p->p4.p = 0;.  i
6500: 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29  f( n==P4_INT32 )
6510: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74  {.    /* Note: t
6520: 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65  his cast is safe
6530: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72  , because the or
6540: 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20  igin data point 
6550: 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a  was an int.    *
6560: 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20  * that was cast 
6570: 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72  to a (const char
6580: 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d   *). */.    pOp-
6590: 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50  >p4.i = SQLITE_P
65a0: 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a  TR_TO_INT(zP4);.
65b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
65c0: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65  = P4_INT32;.  }e
65d0: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
65e0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
65f0: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
6600: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
6610: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
6620: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
6630: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
6640: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
6650: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
6660: 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66 64 65 66  _KEYINFO;.#ifdef
6670: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
6680: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 7d 65  URSOR_HINTS.  }e
6690: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 45 58  lse if( n==P4_EX
66a0: 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 73  PR ){.    /* Res
66b0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f 72 20  ponsibility for 
66c0: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70  deleting the Exp
66d0: 72 20 74 72 65 65 20 69 73 20 68 61 6e 64 65 64  r tree is handed
66e0: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 20 20 20   over to the.   
66f0: 20 2a 2a 20 56 44 42 45 20 62 79 20 74 68 69 73   ** VDBE by this
6700: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65   operation.  The
6710: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68   caller should h
6720: 61 76 65 20 61 6c 72 65 61 64 79 20 69 6e 76 6f  ave already invo
6730: 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  ked.    ** sqlit
6740: 65 33 45 78 70 72 44 75 70 28 29 20 6f 72 20 77  e3ExprDup() or w
6750: 68 61 74 65 76 65 72 20 6f 74 68 65 72 20 72 6f  hatever other ro
6760: 75 74 69 6e 65 20 69 73 20 6e 65 65 64 65 64 20  utine is needed 
6770: 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20 20 20 2a  to make a .    *
6780: 2a 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f  * private copy o
6790: 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20  f the tree. */. 
67a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72     pOp->p4.pExpr
67b0: 20 3d 20 28 45 78 70 72 2a 29 7a 50 34 3b 0a 20   = (Expr*)zP4;. 
67c0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
67d0: 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e 64 69 66   P4_EXPR;.#endif
67e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
67f0: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
6800: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
6810: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
6820: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
6830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
6840: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
6850: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
6860: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
6870: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
6880: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
6890: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
68a0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
68b0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
68c0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
68d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
68e0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
68f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
6900: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
6910: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
6920: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
6930: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
6940: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
6950: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
6960: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
6970: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
6980: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
6990: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
69a0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
69b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
69c0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
69d0: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
69e0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
69f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6a00: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
6a10: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
6a20: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
6a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6a40: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
6a50: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
6a60: 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
6a70: 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20  se, pIdx),.     
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a   P4_KEYINFO);.}.
6aa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6ab0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6ac0: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61  MMENTS./*.** Cha
6ad0: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
6ae0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
6af0: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
6b00: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
6b10: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
6b20: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
6b30: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
6b40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
6b50: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
6b60: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
6b70: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
6b80: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
6b90: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
6ba0: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
6bb0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
6bc0: 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28  id vdbeVComment(
6bd0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
6be0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
6bf0: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73  _list ap){.  ass
6c00: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
6c10: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
6c20: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
6c30: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
6c40: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
6c50: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
6c60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6c70: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
6c80: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29  assert( p->aOp )
6c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6ca0: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  ree(p->db, p->aO
6cb0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
6cc0: 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  ment);.    p->aO
6cd0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
6ce0: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
6cf0: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
6d00: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a  ormat, ap);.  }.
6d10: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
6d20: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
6d30: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6d40: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6d50: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
6d60: 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74  ( p ){.    va_st
6d70: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
6d80: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
6d90: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
6da0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
6db0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
6dc0: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
6dd0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
6de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6df0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
6e00: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
6e10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6e20: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
6e30: 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61  oop);.    va_sta
6e40: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
6e50: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
6e60: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
6e70: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
6e80: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
6e90: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23   /* NDEBUG */..#
6ea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
6eb0: 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a  E_COVERAGE./*.**
6ec0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69   Set the value i
6ed0: 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66  f the iSrcLine f
6ee0: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65  ield for the pre
6ef0: 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e  viously coded in
6f00: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6f10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6f20: 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65  tLineNumber(Vdbe
6f30: 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b   *v, int iLine){
6f40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
6f50: 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c  tOp(v,-1)->iSrcL
6f60: 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23  ine = iLine;.}.#
6f70: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6f80: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f  VDBE_COVERAGE */
6f90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6fa0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
6fb0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
6fc0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
6fd0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
6fe0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
6ff0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
7000: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
7010: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7020: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
7030: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
7040: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
7050: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
7060: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
7070: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
7080: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
7090: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
70a0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
70b0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
70c0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
70d0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
70e0: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
70f0: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
7100: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
7110: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
7120: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
7130: 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d  .** after an OOM
7140: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
7150: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
7160: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
7170: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
7180: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
7190: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
71a0: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
71b0: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
71c0: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
71d0: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
71e0: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
71f0: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
7200: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
7210: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
7220: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64   Valgrind..*/.Vd
7230: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
7240: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
7250: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
7260: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
7270: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
7280: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
7290: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
72a0: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
72b0: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
72c0: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
72d0: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
72e0: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
72f0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
7300: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
7310: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
7320: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
7330: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
7340: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7350: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
7360: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
7370: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
7380: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
7390: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
73a0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
73b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
73c0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
73d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
73e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
73f0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
7400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7410: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
7420: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  ];.  }.}..#if de
7430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7440: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
7450: 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ENTS)./*.** Retu
7460: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  rn an integer va
7470: 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  lue for one of t
7480: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
7490: 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a   the opcode pOp.
74a0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
74b0: 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f   character c..*/
74c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
74d0: 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63  slateP(char c, c
74e0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20  onst Op *pOp){. 
74f0: 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65   if( c=='1' ) re
7500: 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  turn pOp->p1;.  
7510: 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74  if( c=='2' ) ret
7520: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  urn pOp->p2;.  i
7530: 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75  f( c=='3' ) retu
7540: 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  rn pOp->p3;.  if
7550: 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72  ( c=='4' ) retur
7560: 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72  n pOp->p4.i;.  r
7570: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d  eturn pOp->p5;.}
7580: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7590: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
75a0: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
75b0: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
75c0: 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e listing..**.**
75d0: 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66   The Synopsis: f
75e0: 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ield in comments
75f0: 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73   in the vdbe.c s
7600: 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20  ource file gets 
7610: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
7620: 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20  an extra string 
7630: 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64  that is appended
7640: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f   to the sqlite3O
7650: 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e  pcodeName().  In
7660: 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20   the.** absence 
7670: 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74  of other comment
7680: 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73  s, this synopsis
7690: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d   becomes the com
76a0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f  ment on the opco
76b0: 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e  de..** Some tran
76c0: 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a  slation occurs:.
76d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22  **.**       "PX"
76e0: 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22        ->  "r[X]"
76f0: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
7700: 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  "   ->  "r[X..X+
7710: 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22  Y-1]"  or "r[x]"
7720: 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a   if y is 0 or 1.
7730: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b  **       "PX@PY+
7740: 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59  1" ->  "r[X..X+Y
7750: 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20  ]"    or "r[x]" 
7760: 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20  if y is 0.**    
7770: 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20     "PY..PY"  -> 
7780: 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20   "r[X..Y]"      
7790: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d  or "r[x]" if y<=
77a0: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  x.*/.static int 
77b0: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a  displayComment(.
77c0: 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c    const Op *pOp,
77d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
77e0: 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74  de to be comment
77f0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7800: 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72  ar *zP4,   /* Pr
7810: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
7820: 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a  d value for P4 *
7830: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  /.  char *zTemp,
7840: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
7850: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20  result here */. 
7860: 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20   int nTemp      
7870: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
7880: 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b  ilable in zTemp[
7890: 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ] */.){.  const 
78a0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20  char *zOpName;. 
78b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
78c0: 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f  nopsis;.  int nO
78d0: 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c  pName;.  int ii,
78e0: 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d   jj;.  zOpName =
78f0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
7900: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
7910: 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  nOpName = sql
7920: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
7930: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70  Name);.  if( zOp
7940: 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20  Name[nOpName+1] 
7950: 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43  ){.    int seenC
7960: 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  om = 0;.    char
7970: 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69   c;.    zSynopsi
7980: 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e  s = zOpName += n
7990: 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20  OpName + 1;.    
79a0: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
79b0: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
79c0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
79d0: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
79e0: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
79f0: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
7a00: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
7a10: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
7a20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7a30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7a40: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
7a50: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
7a60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
7a70: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
7a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7a90: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7aa0: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
7ab0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
7ac0: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
7ad0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
7ae0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
7af0: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
7b00: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
7b10: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
7b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7b30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7b40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
7b50: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
7b60: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
7b70: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
7b80: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
7b90: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
7bb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7bc0: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
7bd0: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
7be0: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
7bf0: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
7c00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
7c10: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
7c20: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
7c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7c40: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
7c50: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
7c60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7c70: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
7c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7c90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7ca0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7cb0: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
7cc0: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
7cd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7ce0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
7cf0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
7d00: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
7d10: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
7d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
7d30: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
7d40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7d50: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
7d60: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7d70: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
7d80: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
7d90: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
7da0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7db0: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
7dc0: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
7dd0: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
7de0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7df0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
7e00: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
7e10: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7e20: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
7e30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7e40: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
7e50: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
7e60: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
7e70: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
7e80: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
7e90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7ea0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7eb0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
7ec0: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
7ed0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7ee0: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
7ef0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
7f00: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
7f10: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
7f20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7f30: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
7f40: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
7f50: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
7f60: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
7f70: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
7f80: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
7f90: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
7fa0: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
7fb0: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
7fc0: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
7fd0: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
7fe0: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
7ff0: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
8000: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
8010: 79 50 34 45 78 70 72 28 69 6e 74 20 6e 54 65 6d  yP4Expr(int nTem
8020: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
8030: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
8040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
8050: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  = 0;.  int n;.  
8060: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
8070: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
8080: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73  _STRING:.      s
8090: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
80a0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
80b0: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
80c0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
80d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
80e0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
80f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8100: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
8110: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
8120: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
8130: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
8140: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
8150: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8160: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
8170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8180: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
8190: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
81a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
81b0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72 5b 25  emp, zTemp, "r[%
81c0: 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d]", pExpr->iTab
81d0: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
81e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
81f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
8200: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
8210: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
8220: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8230: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8240: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
8250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8260: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8270: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8280: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
8290: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
82a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
82b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
82c0: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
82d0: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
82e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
82f0: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
8300: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
8310: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8320: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
8330: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8340: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
8350: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
8360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8370: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
8380: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
8390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
83a0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
83b0: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
83c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
83d0: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
83e0: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
83f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8400: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
8410: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
8420: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8430: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
8440: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8450: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
8460: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
8470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8480: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
8490: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
84a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
84b0: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
84c0: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
84d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
84e0: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
84f0: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
8500: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8510: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
8520: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
8530: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
8540: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
8550: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8560: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
8570: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
8580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8590: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
85a0: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
85b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
85c0: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
85d0: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
85e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
85f0: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
8600: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
8610: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8620: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
8630: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
8640: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
8650: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
8660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8670: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
8680: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
8690: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
86a0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
86b0: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
86c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
86d0: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
86e0: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
86f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
8700: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
8710: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
8720: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
8730: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
8740: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
8750: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
8760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8770: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
8780: 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20  s", "expr");.   
8790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
87a0: 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20   if( zOp ){.    
87b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
87c0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
87d0: 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20  %s(", zOp);.    
87e0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
87f0: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
8800: 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78  n += displayP4Ex
8810: 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d  pr(nTemp-n, zTem
8820: 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  p+n, pExpr->pLef
8830: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 6e 54  t);.    if( n<nT
8840: 65 6d 70 2d 31 20 26 26 20 70 45 78 70 72 2d 3e  emp-1 && pExpr->
8850: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
8860: 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27 2c 27  zTemp[n++] = ','
8870: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 64 69 73  ;.      n += dis
8880: 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70  playP4Expr(nTemp
8890: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78  -n, zTemp+n, pEx
88a0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
88b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
88c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c  nprintf(nTemp-n,
88d0: 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29 3b 0a   zTemp+n, ")");.
88e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
88f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
8900: 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  mp);.}.#endif /*
8910: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
8920: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8930: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8940: 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66  _HINTS) */...#if
8950: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
8960: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8970: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
8980: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
8990: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
89a0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
89b0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
89c0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
89d0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
89e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
89f0: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
8a00: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
8a10: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
8a20: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
8a30: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
8a40: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
8a50: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
8a60: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
8a70: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
8a80: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
8a90: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8aa0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
8ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8ac0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8ad0: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
8ae0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8af0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8b00: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
8b10: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
8b20: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
8b30: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
8b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
8b50: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
8b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
8b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
8b80: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
8b90: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
8ba0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
8bb0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
8bc0: 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20  me : "nil";.    
8bd0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
8be0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
8bf0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8c00: 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==6 && memcmp(z
8c10: 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29  Coll,"BINARY",6)
8c20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8c30: 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20   zColl = "B";.  
8c40: 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20          n = 1;. 
8c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c60: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37   if( i+n>nTemp-7
8c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
8c80: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
8c90: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
8ca0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
8cb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8cc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
8cd0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
8ce0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
8cf0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8d00: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
8d10: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
8d20: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
8d30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
8d40: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
8d50: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
8d60: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
8d70: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
8d80: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
8d90: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
8da0: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
8db0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8dc0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
8dd0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8de0: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
8df0: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
8e00: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e   displayP4Expr(n
8e10: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70 4f 70  Temp, zTemp, pOp
8e20: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
8e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8e40: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
8e50: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
8e60: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
8e70: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
8e80: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
8e90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8ea0: 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73  , zTemp, "(%.20s
8eb0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
8ec0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
8ee0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
8ef0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8f00: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
8f10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8f20: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8f30: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
8f40: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
8f50: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
8f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
8f70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8f80: 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  G.    case P4_FU
8f90: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
8fa0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
8fb0: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
8fc0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
8fd0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8fe0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
8ff0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
9000: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
9010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9020: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9030: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
9040: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9050: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9060: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
9070: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
9080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9090: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
90a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
90b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
90c0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
90d0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
90e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
90f0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
9100: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9110: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
9120: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
9130: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
9140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9150: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
9160: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
9170: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
9180: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
9190: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
91a0: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
91b0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
91c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
91d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
91e0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
91f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9200: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
9210: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
9220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9230: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9240: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
9250: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9260: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9270: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
9280: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
9290: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
92a0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
92b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
92c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
92d0: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
92e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
92f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9300: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9310: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
9320: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
9330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9340: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
9350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9360: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
9370: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
9380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
9390: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
93a0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
93b0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
93c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
93d0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
93e0: 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20  ", pVtab);.     
93f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9400: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
9410: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
9420: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9430: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
9440: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
9470: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
9480: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9490: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
94a0: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
94b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
94c0: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
94d0: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
94e0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
94f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9500: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9510: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
9520: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
9530: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
9540: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
9550: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
9560: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9570: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
9580: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
9590: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20  n zP4;.}.#endif 
95a0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
95b0: 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  P4 */../*.** Dec
95c0: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
95d0: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
95e0: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
95f0: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
9600: 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64  .** The prepared
9610: 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64   statements need
9620: 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61   to know in adva
9630: 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  nce the complete
9640: 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63   set of.** attac
9650: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68  hed databases th
9660: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20  at will be use. 
9670: 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65   A mask of these
9680: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73   databases.** is
9690: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70   maintained in p
96a0: 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68  ->btreeMask.  Th
96b0: 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61  e p->lockMask va
96c0: 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65  lue is the subse
96d0: 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65  t of.** p->btree
96e0: 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  Mask of database
96f0: 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  s that will requ
9700: 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  ire a lock..*/.v
9710: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
9720: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
9730: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
9740: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
9750: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
9760: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
9770: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
9780: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
9790: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
97a0: 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
97b0: 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b  ->btreeMask, i);
97c0: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
97d0: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
97e0: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
97f0: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62  ].pBt) ){.    Db
9800: 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d  MaskSet(p->lockM
9810: 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  ask, i);.  }.}..
9820: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9830: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
9840: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
9850: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
9860: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
9870: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
9880: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
9890: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
98a0: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
98b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
98c0: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
98d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
98e0: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
98f0: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
9900: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
9910: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
9920: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
9930: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
9940: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
9950: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
9960: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
9970: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
9980: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
9990: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
99a0: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
99b0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
99c0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
99d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
99e0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
99f0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
9a00: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
9a10: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
9a20: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
9a30: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
9a40: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
9a50: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
9a60: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
9a70: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
9a80: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
9a90: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
9aa0: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
9ab0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
9ac0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
9ad0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
9ae0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
9af0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9b00: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
9b10: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
9b20: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
9b30: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
9b40: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
9b50: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
9b60: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
9b70: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
9b80: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
9b90: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
9ba0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
9bb0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
9bc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
9bd0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
9be0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
9bf0: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
9c00: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
9c10: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
9c20: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
9c30: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
9c40: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
9c50: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
9c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9c70: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
9c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
9c90: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
9ca0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
9cb0: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
9cc0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
9cd0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
9ce0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
9cf0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
9d00: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
9d10: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
9d20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
9d30: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
9d40: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
9d50: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
9d60: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
9d70: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
9d80: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9d90: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
9da0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
9db0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
9dc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9dd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9de0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
9df0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
9e00: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
9e10: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
9e20: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
9e30: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
9e40: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  nter()..*/.stati
9e50: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
9e60: 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65  E void vdbeLeave
9e70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9e80: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
9e90: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
9ea0: 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20  int nDb;.  db = 
9eb0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
9ec0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
9ed0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
9ee0: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
9ef0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
9f00: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
9f10: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
9f20: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
9f30: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
9f40: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
9f50: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
9f60: 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
9f70: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
9f80: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62  be *p){.  if( Db
9f90: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
9fa0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9fb0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9fc0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65  n case */.  vdbe
9fd0: 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64  Leave(p);.}.#end
9fe0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
9ff0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
a000: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a010: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
a020: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
a030: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
a040: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
a050: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
a060: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a070: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
a080: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
a090: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
a0a0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
a0b0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
a0c0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
a0d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
a0e0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
a0f0: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
a100: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
a110: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
a120: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
a130: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
a140: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
a150: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
a160: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a170: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
a180: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
a190: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
a1a0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
a1b0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
a1c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
a1d0: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
a1e0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
a1f0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
a200: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
a210: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
a220: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
a230: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
a240: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
a250: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
a260: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
a270: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
a280: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
a290: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
a2a0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
a2b0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
a2c0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
a2d0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
a2e0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
a2f0: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
a300: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
a310: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
a320: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
a330: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
a340: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
a350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
a360: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
a370: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
a380: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
a390: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
a3a0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
a3b0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
a3c0: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
a3d0: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
a3e0: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
a3f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
a400: 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  {.      do{.    
a410: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
a420: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
a430: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
a440: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  oc);.      }whil
a450: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
a460: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
a470: 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
a480: 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31     assert( (&p[1
a490: 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d  ])==pEnd || p[0]
a4a0: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a4c0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
a4d0: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29  mInvariants(p) )
a4e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
a4f0: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
a500: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
a510: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
a520: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
a530: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
a540: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
a550: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
a560: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
a570: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
a580: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
a590: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
a5a0: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
a5b0: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
a5c0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
a5d0: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
a5e0: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
a5f0: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
a600: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
a610: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
a620: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
a630: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
a640: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
a650: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
a660: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
a670: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
a680: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
a690: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
a6a0: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
a6b0: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
a6c0: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
a6d0: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
a6e0: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
a6f0: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
a700: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
a710: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
a720: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
a730: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
a740: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
a750: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
a760: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
a770: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
a780: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
a790: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
a7a0: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
a7b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a7c0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
a7d0: 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b  ags & MEM_Agg );
a7e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a7f0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
a800: 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Dyn );.      tes
a810: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
a820: 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20  & MEM_Frame );. 
a830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a840: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
a850: 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66  wSet );.      if
a860: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
a870: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
a880: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
a890: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
a8a0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
a8b0: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
a8c0: 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  se if( p->szMall
a8d0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
a8e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a8f0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
a900: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
a910: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
a920: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
a930: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
a940: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
a950: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 64 62 2d  <pEnd );.    db-
a960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
a970: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
a980: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
a990: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
a9a0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
a9b0: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
a9c0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
a9d0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
a9e0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
a9f0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
aa00: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
aa10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
aa20: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
aa30: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
aa40: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
aa50: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
aa60: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
aa70: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
aa80: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
aa90: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
aaa0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
aab0: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
aac0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
aad0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
aae0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
aaf0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
ab00: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
ab10: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
ab20: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
ab30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ab40: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
ab50: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
ab60: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
ab70: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
ab80: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
ab90: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
aba0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
abb0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
abc0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
abd0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
abe0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
abf0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
ac00: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
ac10: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
ac20: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
ac30: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
ac40: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
ac50: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
ac60: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
ac70: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
ac80: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
ac90: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
aca0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
acb0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
acc0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
acd0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
ace0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
acf0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
ad00: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
ad10: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
ad20: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
ad30: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
ad40: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
ad50: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
ad60: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
ad70: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
ad80: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
ad90: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
ada0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
adb0: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
adc0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
add0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
ade0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
adf0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
ae20: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
ae30: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
ae40: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae60: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
ae70: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
ae80: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
ae90: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
aea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
aeb0: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
aec0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
aed0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
aee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
aef0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
af00: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
af10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
af20: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
af30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
af40: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
af50: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
af60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
af90: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
afa0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
afb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
afc0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
afd0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
afe0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
aff0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
b000: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
b010: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
b020: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
b030: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
b040: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
b050: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
b060: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
b070: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
b080: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
b090: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
b0a0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
b0b0: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
b0c0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
b0d0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
b0e0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
b0f0: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
b100: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
b110: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
b120: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
b130: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
b140: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
b150: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
b160: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
b170: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
b180: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
b190: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
b1a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b1b0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
b1c0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
b1d0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
b1e0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
b1f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b200: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
b210: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b220: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
b230: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
b240: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
b250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
b260: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
b270: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
b280: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
b290: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
b2a0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
b2b0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
b2c0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
b2d0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
b2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
b2f0: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
b300: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
b310: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
b320: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
b330: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
b340: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
b350: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
b360: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
b370: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
b380: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
b390: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
b3a0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
b3b0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
b3c0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
b3d0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
b3e0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
b3f0: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
b400: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
b410: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
b420: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
b430: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
b440: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
b450: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
b460: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
b470: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
b480: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
b490: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
b4a0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
b4b0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
b4c0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
b4d0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
b4e0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
b4f0: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
b500: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
b510: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
b520: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b530: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
b540: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
b550: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
b560: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
b570: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
b580: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
b590: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
b5a0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
b5b0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
b5c0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
b5d0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
b5e0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
b5f0: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
b600: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
b610: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
b620: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
b630: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
b640: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
b650: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
b660: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b670: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
b680: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
b690: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
b6a0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
b6b0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
b6c0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
b6d0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
b6e0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
b6f0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
b700: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
b710: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
b720: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
b730: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
b740: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
b750: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
b760: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
b770: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
b780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b790: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
b7a0: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
b7b0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
b7c0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
b7d0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
b7e0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
b7f0: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
b800: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
b810: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
b820: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
b830: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
b840: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
b850: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
b860: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
b870: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
b880: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
b890: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
b8a0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
b8b0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
b8c0: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
b8d0: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
b8e0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
b8f0: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
b900: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
b910: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
b920: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
b930: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
b940: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
b950: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
b960: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
b970: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
b980: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
b990: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
b9a0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
b9b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
b9c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
b9d0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
ba00: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
ba10: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
ba20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ba30: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
ba40: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ba50: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
ba60: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
ba70: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
ba80: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
ba90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
baa0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
bab0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
bac0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
bad0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
bae0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
baf0: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
bb00: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
bb10: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
bb20: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
bb30: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
bb40: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
bb50: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
bb60: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
bb70: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
bb80: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
bb90: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
bba0: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
bbb0: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
bbc0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
bbd0: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
bbe0: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
bbf0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
bc00: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
bc10: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
bc20: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
bc30: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
bc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
bc50: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
bc60: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
bc70: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
bc80: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
bc90: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
bca0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
bcb0: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
bcc0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
bcd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
bce0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
bcf0: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
bd00: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
bd10: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
bd20: 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20  , nSub!=0) ){.  
bd30: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
bd40: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
bd50: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
bd60: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
bd70: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
bd80: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
bd90: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
bda0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
bdb0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
bdc0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
bdd0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
bde0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
bdf0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
be00: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
be10: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
be20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
be30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
be40: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
be50: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
be60: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
be70: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
be80: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bea0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P2 */.    pMem+
beb0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
bec0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
bed0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
bee0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
bf10: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
bf20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
bf30: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
bf40: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
bf50: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
bf60: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
bf70: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
bf80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
bf90: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
bfa0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
bfb0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
bfc0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
bfd0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  (pOp, pMem->z, p
bfe0: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a  Mem->szMalloc);.
bff0: 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65      if( zP4!=pMe
c000: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
c010: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
c020: 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31  tr(pMem, zP4, -1
c030: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
c040: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c050: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
c060: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
c070: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
c080: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
c090: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
c0a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
c0b0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
c0c0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
c0d0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
c0e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c0f0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c100: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29  esize(pMem, 4) )
c110: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
c120: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
c130: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
c140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
c150: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
c160: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c170: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
c180: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
c190: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
c1a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
c1b0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
c1c0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
c1d0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
c1e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
c1f0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
c200: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
c210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
c220: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
c230: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
c240: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
c250: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
c260: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
c270: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
c280: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
c290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
c2a0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
c2b0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c2c0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
c2d0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
c2e0: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
c2f0: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
c300: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
c310: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c320: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
c330: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c340: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
c370: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
c380: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
c390: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
c3a0: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
c3b0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
c3c0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
c3d0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
c3e0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
c3f0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
c400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
c410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c420: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
c430: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c440: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
c450: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
c460: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
c470: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
c480: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c490: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
c4a0: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
c4b0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
c4c0: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
c4d0: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
c4e0: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
c4f0: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
c500: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
c510: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
c520: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
c530: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
c540: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
c550: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
c560: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
c570: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
c580: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
c590: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
c5a0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
c5b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
c5c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c5d0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
c5e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
c5f0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
c600: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
c610: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
c620: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
c630: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
c640: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
c650: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c660: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
c670: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
c680: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
c690: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
c6a0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
c6b0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
c6c0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
c6d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
c6e0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
c6f0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
c700: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
c710: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
c720: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c730: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
c740: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
c750: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
c760: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
c770: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
c780: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
c790: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c7a0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
c7b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
c7c0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
c7d0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
c7e0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
c7f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c800: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
c810: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
c820: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
c830: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
c840: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
c850: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
c860: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
c870: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
c880: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
c890: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
c8a0: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
c8b0: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20  xed size buffer 
c8c0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
c8d0: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
c8e0: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66  space.  If insuf
c8f0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73  ficient space is
c900: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
c910: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
c920: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65  he pBuf paramete
c930: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  r is the initial
c940: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e   value of a poin
c950: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  ter which will.*
c960: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65  * receive the ne
c970: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20  w memory.  pBuf 
c980: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c  is normally NULL
c990: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  .  If pBuf is no
c9a0: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65  t.** NULL, it me
c9b0: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ans that memory 
c9c0: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
c9d0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
c9e0: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69   and that.** thi
c9f0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
ca00: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e   not allocate an
ca10: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57  y new memory.  W
ca20: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a  hen pBuf is not.
ca30: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ** NULL simply r
ca40: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c  eturn pBuf.  Onl
ca50: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  y allocate new m
ca60: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e  emory space when
ca70: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c   pBuf.** is NULL
ca80: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
ca90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
caa0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
cab0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 46 72 6f  eded..**.** pFro
cac0: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 2a 70 6e 46  m points to *pnF
cad0: 72 6f 6d 20 62 79 74 65 73 20 6f 66 20 61 76 61  rom bytes of ava
cae0: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 4e  ilable space.  N
caf0: 65 77 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  ew space is allo
cb00: 63 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  cated.** from th
cb10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 46 72  e end of the pFr
cb20: 6f 6d 20 62 75 66 66 65 72 20 61 6e 64 20 2a 70  om buffer and *p
cb30: 6e 46 72 6f 6d 20 69 73 20 64 65 63 72 65 6d 65  nFrom is decreme
cb40: 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 4e  nted..**.** *pnN
cb50: 65 65 64 65 64 20 69 73 20 61 20 63 6f 75 6e 74  eeded is a count
cb60: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
cb70: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
cb80: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
cb90: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
cba0: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
cbb0: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
cbc0: 61 63 65 20 69 6e 20 70 46 72 6f 6d 20 74 6f 20  ace in pFrom to 
cbd0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
cbe0: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
cbf0: 72 65 6d 65 6e 74 20 2a 70 6e 4e 65 65 64 65 64  rement *pnNeeded
cc00: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
cc10: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
cc20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
cc30: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
cc40: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
cc50: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
cc60: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
cc70: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
cc80: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
cc90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cca0: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
ccb0: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 46 72 6f 6d  e */.  u8 *pFrom
ccc0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
ccd0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
cce0: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
ccf0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 46 72 6f 6d 2c  /.  int *pnFrom,
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
cd10: 55 54 3a 20 53 70 61 63 65 20 61 76 61 69 6c 61  UT: Space availa
cd20: 62 6c 65 20 61 74 20 70 46 72 6f 6d 20 2a 2f 0a  ble at pFrom */.
cd30: 20 20 69 6e 74 20 2a 70 6e 4e 65 65 64 65 64 20    int *pnNeeded 
cd40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
cd50: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
cd60: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
cd70: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
cd80: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
cd90: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
cda0: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
cdb0: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42  Buf==0 ){.    nB
cdc0: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
cdd0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
cde0: 74 65 20 3c 3d 20 2a 70 6e 46 72 6f 6d 20 29 7b  te <= *pnFrom ){
cdf0: 0a 20 20 20 20 20 20 2a 70 6e 46 72 6f 6d 20 2d  .      *pnFrom -
ce00: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70  = nByte;.      p
ce10: 42 75 66 20 3d 20 26 70 46 72 6f 6d 5b 2a 70 6e  Buf = &pFrom[*pn
ce20: 46 72 6f 6d 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  From];.    }else
ce30: 7b 0a 20 20 20 20 20 20 2a 70 6e 4e 65 65 64 65  {.      *pnNeede
ce40: 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  d += nByte;.    
ce50: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
ce60: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
ce70: 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20  MENT(pBuf) );.  
ce80: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
ce90: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
cea0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
ceb0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
cec0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
ced0: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
cee0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
cef0: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
cf00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
cf10: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
cf20: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
cf30: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
cf40: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
cf50: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
cf60: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
cf70: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
cf80: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
cf90: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
cfa0: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
cfb0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
cfc0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
cfd0: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
cfe0: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
cff0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
d000: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
d010: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
d020: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
d030: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
d040: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
d050: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
d060: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
d070: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
d080: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
d090: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
d0a0: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
d0b0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
d0c0: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
d0d0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
d0e0: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
d0f0: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
d100: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
d110: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
d120: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
d130: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
d140: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
d150: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
d160: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
d170: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
d180: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
d190: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
d1a0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
d1b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
d1c0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
d1d0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d1e0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
d1f0: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
d200: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
d210: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
d220: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
d230: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
d240: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
d250: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
d260: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
d270: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
d280: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
d290: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
d2a0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
d2b0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
d2c0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
d2d0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
d2e0: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
d2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
d300: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
d310: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
d320: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d330: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
d340: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d350: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
d360: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
d370: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
d380: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
d390: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d3a0: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
d3b0: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
d3c0: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
d3d0: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
d3e0: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
d3f0: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
d400: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
d410: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
d420: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
d430: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
d440: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
d450: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
d460: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
d470: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
d480: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
d490: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
d4a0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
d4b0: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
d4c0: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
d4d0: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
d4e0: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
d4f0: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
d500: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
d510: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
d520: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
d530: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
d560: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
d570: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
d580: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d590: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
d5a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5c0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
d5d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d5e0: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d600: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
d610: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
d620: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
d630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d640: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
d650: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
d660: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
d690: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
d6a0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
d6d0: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
d6e0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
d6f0: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
d700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d710: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
d720: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
d730: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
d760: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c       /* Availabl
d790: 65 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a  e free space */.
d7a0: 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20    u8 *zCsr;     
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   /* Memory avail
d7d0: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
d7e0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ion */.  int nBy
d7f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
d800: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d          /* How m
d810: 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79  uch extra memory
d820: 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20   is needed */.. 
d830: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
d840: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
d850: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
d860: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
d870: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
d880: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
d890: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
d8a0: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
d8b0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
d8d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
d8e0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
d8f0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
d900: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
d910: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
d920: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
d930: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
d940: 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70  Arg;.  nOnce = p
d950: 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  Parse->nOnce;.  
d960: 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e  if( nOnce==0 ) n
d970: 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73  Once = 1; /* Ens
d980: 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ure at least one
d990: 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63   byte in p->aOnc
d9a0: 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20  eFlag[] */.  .  
d9b0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
d9c0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
d9d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
d9e0: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
d9f0: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
da00: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
da10: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
da20: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
da30: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
da40: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
da50: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
da60: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
da70: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ace for.  ** Vdb
da80: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
da90: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
daa0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
dab0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
dac0: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
dad0: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
dae0: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
daf0: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
db00: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
db10: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
db20: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
db30: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
db40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
db50: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
db60: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
db70: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
db80: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
db90: 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72  ace for memory r
dba0: 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61  egisters, SQL va
dbb0: 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75  riables, VDBE cu
dbc0: 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20  rsors and .  ** 
dbd0: 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73  an array to mars
dbe0: 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hal SQL function
dbf0: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20   arguments in.. 
dc00: 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38   */.  zCsr = (u8
dc10: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
dc20: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
dc30: 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c   Memory avaliabl
dc40: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
dc50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
dc60: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73  arse->nOpAlloc*s
dc70: 69 7a 65 6f 66 28 4f 70 29 20 3c 3d 20 30 78 37  izeof(Op) <= 0x7
dc80: 66 66 66 66 66 30 30 20 29 3b 0a 20 20 6e 46 72  fffff00 );.  nFr
dc90: 65 65 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 4f  ee = (pParse->nO
dca0: 70 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6e 4f 70 29  pAlloc - p->nOp)
dcb0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4f 70 5b 30  *sizeof(p->aOp[0
dcc0: 5d 29 3b 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65  ]); /* Available
dcd0: 20 73 70 61 63 65 20 2a 2f 0a 0a 20 20 72 65 73   space */..  res
dce0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
dcf0: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
dd00: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
dd10: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
dd20: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
dd30: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
dd40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
dd50: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
dd60: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
dd70: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
dd80: 43 73 72 2c 20 30 2c 20 6e 46 72 65 65 29 3b 0a  Csr, 0, nFree);.
dd90: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
dda0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26  BYTE_ALIGNMENT(&
ddb0: 7a 43 73 72 5b 6e 46 72 65 65 5d 29 20 29 3b 0a  zCsr[nFree]) );.
ddc0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
ddd0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
dde0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
ddf0: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
de00: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
de10: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
de20: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
de30: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
de40: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
de50: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
de60: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
de70: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
de80: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
de90: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
dea0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
deb0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
dec0: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
ded0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
dee0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
def0: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
df00: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
df10: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
df20: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
df30: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
df40: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
df50: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
df60: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
df70: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
df80: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
df90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
dfa0: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
dfb0: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
dfc0: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
dfd0: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
dfe0: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
dff0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
e000: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
e010: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
e020: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
e030: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
e040: 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c  zeof(Mem), zCsr,
e050: 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29   &nFree, &nByte)
e060: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
e070: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
e080: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
e090: 4d 65 6d 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72  Mem), zCsr, &nFr
e0a0: 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  ee, &nByte);.   
e0b0: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
e0c0: 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c  cSpace(p->apArg,
e0d0: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
e0e0: 2a 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65  *), zCsr, &nFree
e0f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
e100: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
e110: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
e120: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
e130: 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c  ), zCsr, &nFree,
e140: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
e150: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
e160: 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43  ace(p->apCsr, nC
e170: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
e180: 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20  eCursor*),.     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 20 7a 43 73 72 2c 20 26 6e 46 72 65       zCsr, &nFre
e1b0: 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  e, &nByte);.    
e1c0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
e1d0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
e1e0: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 7a  ceFlag, nOnce, z
e1f0: 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42  Csr, &nFree, &nB
e200: 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  yte);.#ifdef SQL
e210: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
e220: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70  SCANSTATUS.    p
e230: 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
e240: 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c  Space(p->anExec,
e250: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
e260: 36 34 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65  64), zCsr, &nFre
e270: 65 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64  e, &nByte);.#end
e280: 69 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  if.    if( nByte
e290: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72   ){.      p->pFr
e2a0: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
e2b0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
e2c0: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  te);.    }.    z
e2d0: 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a  Csr = p->pFree;.
e2e0: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 42 79 74      nFree = nByt
e2f0: 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  e;.  }while( nBy
e300: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
e310: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
e320: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
e330: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
e340: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
e350: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
e360: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
e370: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
e380: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
e390: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
e3a0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
e3b0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
e3c0: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
e3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e3e0: 70 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72  p->azVar && pPar
e3f0: 73 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20  se->nzVar>0 ){. 
e400: 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50     p->nzVar = pP
e410: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20  arse->nzVar;.   
e420: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72   memcpy(p->azVar
e430: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
e440: 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66   p->nzVar*sizeof
e450: 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  (p->azVar[0]));.
e460: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73      memset(pPars
e470: 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61  e->azVar, 0, pPa
e480: 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  rse->nzVar*sizeo
e490: 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  f(pParse->azVar[
e4a0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
e4b0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70  p->aMem ){.    p
e4c0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4e0: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
e4f0: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
e500: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
e510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e520: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
e530: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
e540: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  .    for(n=1; n<
e550: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
e560: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
e570: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
e580: 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ned;.      p->aM
e590: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
e5a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
e5b0: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
e5c0: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
e5d0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
e5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e5f0: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
e600: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
e610: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
e620: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
e630: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
e640: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
e650: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
e660: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
e670: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
e680: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
e690: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e6a0: 70 43 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pCx->pBt==0 || p
e6b0: 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  Cx->eCurType==CU
e6c0: 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
e6d0: 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43   switch( pCx->eC
e6e0: 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61  urType ){.    ca
e6f0: 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45  se CURTYPE_SORTE
e700: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
e710: 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73  e3VdbeSorterClos
e720: 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20  e(p->db, pCx);. 
e730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e740: 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  }.    case CURTY
e750: 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20  PE_BTREE: {.    
e760: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
e770: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e780: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
e790: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  >pBt);.        /
e7a0: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
e7b0: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
e7c0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
e7d0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
e7e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
e7f0: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
e800: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e810: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
e820: 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
e830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e840: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
e850: 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
e860: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
e880: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e890: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
e8a0: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
e8b0: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
e8c0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e8d0: 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
e8e0: 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
e8f0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
e900: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
e910: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
e920: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
e930: 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
e940: 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
e950: 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
e960: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
e970: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
e980: 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
e990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
e9a0: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
e9b0: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
e9c0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
e9d0: 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
e9e0: 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
e9f0: 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
ea00: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
ea10: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
ea20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ea30: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
ea40: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
ea50: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
ea60: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
ea70: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
ea80: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
ea90: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
eaa0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
eab0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
eac0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ead0: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
eae0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
eaf0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
eb00: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
eb10: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
eb20: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
eb30: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
eb40: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
eb50: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
eb60: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
eb70: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
eb80: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
eb90: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
eba0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
ebb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
ebc0: 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
ebd0: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
ebe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ebf0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
ec00: 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
ec10: 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
ec20: 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
ec30: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
ec40: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
ec50: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
ec60: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
ec70: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
ec80: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
ec90: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
eca0: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
ecb0: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
ecc0: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
ecd0: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
ece0: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
ecf0: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
ed00: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
ed10: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
ed20: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
ed30: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
ed40: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
ed50: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
ed60: 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
ed70: 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
ed80: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
ed90: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
eda0: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
edb0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
edc0: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
edd0: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
ede0: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
edf0: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
ee00: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
ee10: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
ee20: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
ee30: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
ee40: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
ee50: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
ee60: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
ee70: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
ee80: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
ee90: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
eea0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
eeb0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
eec0: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
eed0: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
eee0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
eef0: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
ef00: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
ef10: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
ef20: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
ef30: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
ef40: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
ef50: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
ef60: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
ef70: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
ef80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ef90: 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
efa0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
efb0: 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
efc0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
efd0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
efe0: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
eff0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
f000: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
f010: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
f020: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
f030: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
f040: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
f050: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
f060: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
f070: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
f080: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
f090: 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
f0a0: 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
f0b0: 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
f0c0: 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
f0d0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
f0e0: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
f0f0: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
f100: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
f110: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
f120: 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  M after a single
f130: 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   run..*/.static 
f140: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
f150: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
f160: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
f170: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
f180: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
f190: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
f1a0: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
f1b0: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
f1c0: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
f1d0: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
f1e0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
f1f0: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
f200: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
f210: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
f220: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
f230: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
f240: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
f250: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
f260: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
f270: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
f280: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
f290: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
f2a0: 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
f2b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
f2c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f2d0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
f2e0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
f2f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
f300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f310: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
f320: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
f330: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
f340: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
f350: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
f360: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
f370: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
f380: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
f390: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
f3a0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
f3b0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
f3c0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
f3d0: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
f3e0: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
f3f0: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
f400: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
f410: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
f420: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
f430: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
f440: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
f450: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
f460: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
f470: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
f480: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
f490: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
f4a0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
f4b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f4c0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
f4d0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
f4e0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
f4f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
f500: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
f510: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
f520: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
f530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
f540: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
f550: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
f560: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
f570: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
f580: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
f590: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
f5a0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
f5b0: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
f5c0: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
f5d0: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
f5e0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
f5f0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
f600: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
f610: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
f620: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
f630: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
f640: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
f650: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
f660: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
f670: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
f680: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
f690: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
f6a0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
f6b0: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
f6c0: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
f6d0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
f6e0: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
f6f0: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
f700: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
f710: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
f720: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
f730: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
f740: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
f750: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
f760: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
f770: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
f780: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
f790: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
f7a0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
f7b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
f7d0: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
f7e0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
f7f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
f810: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
f820: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
f830: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f860: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
f870: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
f880: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f8a0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
f8b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
f8c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
f8d0: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
f8e0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
f8f0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
f900: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
f910: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
f920: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
f930: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
f940: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
f950: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
f960: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
f970: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
f980: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
f990: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
f9a0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
f9b0: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
f9c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f9d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
f9e0: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
f9f0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
fa00: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
fa10: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
fa20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
fa30: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
fa40: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
fa50: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
fa60: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
fa70: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
fa80: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
fa90: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
faa0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
fab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
fac0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
fad0: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
fae0: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
faf0: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
fb00: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
fb10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
fb20: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
fb30: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
fb40: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
fb50: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
fb60: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
fb70: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
fb80: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
fb90: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
fba0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
fbb0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
fbc0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
fbd0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
fbe0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
fbf0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
fc00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
fc10: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
fc20: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
fc30: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
fc40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fc50: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
fc60: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
fc70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
fc80: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
fc90: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
fca0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
fcb0: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
fcc0: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
fcd0: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
fce0: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
fcf0: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
fd00: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
fd10: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
fd20: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
fd30: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
fd40: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
fd50: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
fd60: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
fd70: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
fd80: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
fd90: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
fda0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
fdb0: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
fdc0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
fdd0: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
fde0: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
fdf0: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
fe00: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
fe10: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
fe20: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
fe30: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
fe40: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
fe50: 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
fe60: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
fe70: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
fe80: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
fe90: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
fea0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
feb0: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
fec0: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
fed0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
fee0: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
fef0: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
ff00: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
ff10: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
ff20: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
ff30: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
ff40: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
ff50: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
ff60: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
ff70: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
ff80: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
ff90: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
ffa0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
ffb0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
ffc0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
ffd0: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
ffe0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
fff0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
10000 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
10010 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
10020 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
10030 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
10040 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
10050 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10060 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
10070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10080 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
10090 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
100a0 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
100b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
100c0 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
100d0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
100e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
100f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10100 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10110 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
10120 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
10130 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
10140 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
10150 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
10160 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10170 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
10180 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10190 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
101a0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
101b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
101c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
101d0 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
101e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
101f0 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
10200 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
10210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
10220 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
10230 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
10240 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
10250 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
10260 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
10270 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
10280 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
10290 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
102a0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
102b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
102c0 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
102d0 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
102e0 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
102f0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
10300 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
10310 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
10320 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
10330 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
10340 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
10350 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
10360 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
10370 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
10380 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
10390 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
103a0 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
103b0 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
103c0 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
103d0 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
103e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
103f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10400 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10410 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10420 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10430 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10440 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10450 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10460 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
10470 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
10490 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
104a0 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
104b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
104c0 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
104d0 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
104e0 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
104f0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
10500 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
10510 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
10520 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
10530 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
10540 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
10550 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
10560 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
10570 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
10580 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
10590 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
105a0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
105b0 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
105c0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
105d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
105e0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
105f0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10600 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10610 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10620 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10630 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10640 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
10650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10680 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
10690 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
106a0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
106b0 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
106c0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
106d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
106e0 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
106f0 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
10700 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10710 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
10720 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
10730 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
10740 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
10750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10760 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
10770 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
10780 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
10790 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
107a0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
107b0 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
107c0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
107d0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
107e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
107f0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
10800 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
10810 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
10820 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
10830 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10840 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
10850 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
10860 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
10870 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
10880 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
10890 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
108a0 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
108b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
108c0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
108d0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
108e0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
108f0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
10900 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10910 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
10920 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
10930 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
10940 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
10950 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10960 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
10970 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
10980 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
10990 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
109a0 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
109b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
109c0 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
109d0 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
109e0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
109f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
10a00 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
10a10 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
10a20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10a30 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
10a40 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
10a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
10a60 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
10a70 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
10a80 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10a90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10aa0 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
10ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10ac0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
10ad0 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
10ae0 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
10af0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
10b00 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
10b10 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
10b20 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
10b50 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
10b60 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
10b70 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
10b80 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
10b90 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
10ba0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10bb0 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
10bc0 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
10bd0 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
10be0 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
10bf0 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
10c00 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
10c10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
10c20 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
10c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c40 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
10c50 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
10c60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10c70 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
10c80 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
10c90 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
10ca0 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
10cb0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
10cc0 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
10cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10ce0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
10cf0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
10d00 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
10d10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
10d20 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
10d30 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
10d40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
10d50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
10d60 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
10d70 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
10d80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
10d90 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
10da0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
10db0 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
10dc0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
10dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10de0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10df0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
10e00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10e10 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
10e20 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
10e30 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
10e40 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
10e50 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
10e60 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
10e70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10e80 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10e90 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
10ea0 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
10eb0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
10ec0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10ed0 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
10ee0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
10ef0 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
10f00 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
10f10 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10f20 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
10f30 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
10f40 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
10f50 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
10f60 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
10f70 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
10f80 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10f90 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10fa0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10fb0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
10fc0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
10fd0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
10fe0 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
10ff0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
11000 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
11010 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
11020 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
11030 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
11040 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
11050 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
11060 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
11070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11080 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
11090 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
110a0 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
110b0 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
110c0 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
110d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
110e0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
110f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
11100 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11110 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
11120 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11130 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
11140 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
11150 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
11160 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
11170 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
111a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
111b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
111c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
111d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
111e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
111f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11200 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
11210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11220 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11230 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
11240 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11250 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
11260 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
11270 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
11280 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
11290 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
112a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
112b0 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
112c0 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
112d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
112e0 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
112f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
11300 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
11310 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
11320 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
11330 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
11340 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
11350 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11360 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
11370 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
11380 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
11390 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
113a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
113b0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
113c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
113d0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
113e0 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
113f0 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
11400 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
11410 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
11420 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
11430 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11440 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
11450 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11460 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
11470 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
11480 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
11490 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
114a0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
114b0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
114c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
114d0 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
114e0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
114f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11500 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
11510 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
11520 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
11530 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11540 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
11550 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
11560 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
11570 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
11580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11590 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
115a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
115b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
115c0 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
115d0 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
115e0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
115f0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
11600 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
11610 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
11620 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11630 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11640 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
11650 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11660 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11670 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
11680 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
11690 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
116a0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
116b0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
116c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
116d0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
116e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
116f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11700 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11710 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11720 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11730 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
11750 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
11760 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
11770 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
11780 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
11790 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
117a0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
117b0 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
117c0 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
117d0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
117e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
117f0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
11800 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65  fs, zMaster, nee
11810 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69  dSync);.    sqli
11820 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11830 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
11840 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
11850 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
11860 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11870 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
11880 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
11890 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
118a0 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
118b0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
118c0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
118d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
118e0 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
118f0 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
11900 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
11910 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
11920 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
11930 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
11940 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
11950 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
11960 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
11970 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
11980 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
11990 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
119a0 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
119b0 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
119c0 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
119d0 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
119e0 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
119f0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
11a00 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
11a10 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
11a20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
11a30 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11a40 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
11a50 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
11a60 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
11a70 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
11a80 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
11a90 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11aa0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11ab0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11ac0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
11ad0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
11ae0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
11af0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11b00 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
11b10 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
11b20 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11b30 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
11b40 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
11b50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
11b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
11b70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11b80 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
11b90 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
11ba0 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
11bb0 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
11bc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
11bd0 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
11be0 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
11bf0 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
11c00 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
11c10 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
11c20 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
11c30 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
11c40 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
11c50 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
11c60 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
11c70 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
11c80 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
11c90 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
11ca0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
11cb0 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
11cc0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
11cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
11ce0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
11cf0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
11d00 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
11d10 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
11d20 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
11d30 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
11d40 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
11d50 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
11d60 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
11d70 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
11d80 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
11d90 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
11da0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
11db0 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
11dc0 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
11dd0 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
11de0 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
11df0 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
11e00 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
11e10 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
11e20 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
11e30 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
11e40 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
11e50 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
11e60 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
11e70 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
11e80 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
11e90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
11ea0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
11eb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
11ec0 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
11ed0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
11ee0 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
11ef0 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
11f00 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
11f10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
11f20 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
11f30 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
11f40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11f50 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
11f60 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
11f70 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
11f80 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
11f90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
11fa0 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
11fb0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11fc0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
11fd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
11fe0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
11ff0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
12000 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
12010 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
12020 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
12030 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
12040 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
12050 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
12060 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
12070 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
12080 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
12090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
120a0 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
120b0 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
120c0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
120d0 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
120e0 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
120f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
12100 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
12110 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
12120 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
12130 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
12140 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
12150 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
12160 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
12170 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
12180 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
12190 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
121a0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
121b0 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
121c0 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
121d0 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
121e0 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
121f0 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
12200 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
12210 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
12220 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
12230 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12240 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
12250 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
12260 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12270 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
12280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12290 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
122a0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
122b0 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
122c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
122d0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
122e0 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
122f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
12300 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12310 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12320 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12330 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
12340 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12350 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
12360 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
12370 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
12380 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12390 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
123a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
123b0 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
123c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
123d0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
123e0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
123f0 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
12400 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
12410 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
12420 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12440 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
12450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12460 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
12470 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
12480 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
12490 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
124a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
124b0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
124c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
124d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
124e0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
124f0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
12500 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
12510 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
12520 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
12530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12550 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
12560 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
12570 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
12580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12590 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
125a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
125b0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
125c0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
125d0 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
125e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
125f0 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
12600 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
12610 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
12620 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
12630 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
12640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
12650 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
12660 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
12670 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12680 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
12690 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
126a0 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
126b0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
126c0 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
126d0 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
126e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
126f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
12700 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12710 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
12720 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
12730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
12740 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
12750 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
12760 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
12770 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
12780 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
12790 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
127a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
127b0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
127c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
127d0 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
127e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
127f0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
12800 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
12810 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
12820 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
12830 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
12840 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
12850 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
12860 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
12870 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
12880 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
12890 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
128a0 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
128b0 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
128c0 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
128d0 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
128e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
128f0 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
12900 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
12910 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
12920 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
12930 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
12940 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
12950 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
12960 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
12970 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
12980 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
12990 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
129a0 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
129b0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
129c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
129d0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
129e0 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
129f0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
12a00 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
12a10 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  "FOREIGN KEY con
12a20 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
12a30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12a40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
12a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12a60 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
12a70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12a80 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
12a90 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
12aa0 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
12ab0 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
12ac0 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
12ad0 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
12ae0 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
12af0 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
12b00 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
12b10 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
12b20 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
12b30 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
12b40 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
12b50 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
12b60 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
12b70 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
12b80 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
12b90 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
12ba0 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
12bb0 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
12bc0 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
12bd0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
12be0 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
12bf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
12c00 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
12c10 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
12c20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
12c30 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
12c40 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
12c50 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
12c60 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
12c70 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
12c80 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
12c90 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
12ca0 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
12cb0 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
12cc0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
12cd0 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
12ce0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d00 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
12d10 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
12d20 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
12d30 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
12d40 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
12d50 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
12d60 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
12d70 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
12d80 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
12d90 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
12da0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
12db0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
12dc0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
12dd0 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
12de0 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
12df0 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
12e00 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
12e10 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
12e20 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
12e30 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
12e40 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
12e50 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
12e60 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
12e70 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
12e80 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
12e90 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
12ea0 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
12eb0 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
12ec0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
12ed0 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
12ee0 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
12ef0 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
12f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
12f10 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
12f20 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
12f30 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
12f40 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
12f50 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12f60 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
12f70 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
12f80 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
12f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12fa0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
12fb0 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
12fc0 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
12fd0 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
12fe0 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
12ff0 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
13000 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
13010 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
13020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13030 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
13040 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
13050 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
13060 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
13070 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
13080 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
13090 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
130a0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
130b0 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
130c0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
130d0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
130e0 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
130f0 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
13100 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
13110 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
13120 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
13130 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
13140 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
13150 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
13170 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
13180 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
13190 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
131a0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
131b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
131c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
131d0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
131e0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
131f0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
13200 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
13210 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
13220 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
13230 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
13240 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
13250 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
13280 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
13290 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
132a0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
132b0 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
132c0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
132d0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
132e0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
132f0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
13300 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
13310 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
13320 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
13330 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
13340 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
13350 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13360 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
13370 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
13380 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
13390 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
133a0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
133b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
133c0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
133d0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
133e0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
133f0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
13400 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
13410 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
13420 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
13430 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
13440 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
13450 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
13460 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
13470 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
13480 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
13490 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
134a0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
134b0 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
134c0 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
134d0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
134e0 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
134f0 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
13500 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
13510 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
13520 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
13530 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
13540 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
13550 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
13560 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
13570 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13580 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13590 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
135a0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
135b0 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
135c0 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
135d0 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
135e0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
135f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
13600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13610 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
13620 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
13630 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
13640 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
13650 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
13660 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
13670 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
13680 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
13690 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
136a0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
136b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
136c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
136d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
136e0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
136f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
13700 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
13710 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
13720 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
13730 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
13740 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13750 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
13770 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
13780 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
13790 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
137a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
137b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
137c0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
137d0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
137e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
137f0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
13800 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
13810 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
13820 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
13830 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
13840 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
13850 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
13860 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
13870 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
13880 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
13890 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
138a0 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
138b0 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
138c0 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
138d0 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
138e0 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
138f0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
13900 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
13910 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
13920 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
13930 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
13940 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
13950 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
13960 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
13970 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
13980 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
13990 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
139a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
139b0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
139c0 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
139d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
139f0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
13a00 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
13a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13a30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13a40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
13a70 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
13a80 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
13a90 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
13aa0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
13ab0 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
13ac0 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
13ad0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
13ae0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
13af0 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
13b00 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
13b10 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
13b20 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
13b30 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
13b40 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
13b50 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
13b60 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
13b70 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
13b80 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
13b90 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
13ba0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
13bb0 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
13bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
13be0 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
13bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13c00 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
13c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13c20 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
13c30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13c40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
13c60 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
13c70 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13c80 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13c90 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
13ca0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
13cb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13cc0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
13cd0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
13ce0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
13cf0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
13d00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
13d10 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
13d20 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
13d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
13d40 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
13d50 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
13d60 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13d70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13d80 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
13d90 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
13da0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13db0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13dc0 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
13dd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
13de0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
13df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
13e00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13e10 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
13e20 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
13e30 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
13e40 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
13e50 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
13e60 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
13e70 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
13e80 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
13e90 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
13ea0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
13eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
13ed0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
13ee0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
13ef0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
13f00 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
13f10 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
13f20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
13f30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
13f40 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
13f60 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
13f70 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
13f80 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
13f90 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
13fa0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
13fb0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
13fc0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
13fd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
13fe0 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
13ff0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
14000 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
14010 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
14020 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
14030 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
14040 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
14050 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
14060 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
14070 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
14080 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
14090 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
140a0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
140b0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
140c0 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
140d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
140e0 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
140f0 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
14100 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14110 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
14120 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
14130 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
14140 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
14150 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14160 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
14170 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14180 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
14190 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
141a0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
141b0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
141c0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
141d0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
141e0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
141f0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14200 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14210 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
14220 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
14230 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14250 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
14260 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
14270 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
14280 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
14290 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
142a0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
142b0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
142c0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
142d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
142e0 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
142f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
14300 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
14310 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
14320 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
14330 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
14340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14350 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
14360 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
14370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
14380 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
14390 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
143a0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
143b0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
143c0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
143d0 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
143e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
143f0 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
14400 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
14410 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
14420 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
14430 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
14440 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
14450 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
14460 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
14470 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
14480 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
14490 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
144a0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
144b0 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
144c0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
144d0 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
144e0 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
144f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14500 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
14510 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
14520 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14530 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
14540 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
14550 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
14560 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
14570 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
14580 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
14590 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
145a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
145b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
145c0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
145d0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
145e0 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
145f0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
14600 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
14610 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
14620 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
14630 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
14640 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
14650 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
14660 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
14670 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
14680 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
14690 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
146a0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
146b0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
146c0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
146d0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
146e0 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
146f0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
14700 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
14710 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
14720 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
14730 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
14740 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
14750 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
14760 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
14770 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
14780 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
14790 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
147a0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
147b0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
147c0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
147d0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
147e0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
147f0 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
14800 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
14810 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14820 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
14830 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
14840 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
14850 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
14860 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
14870 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
14880 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
14890 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
148a0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
148b0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
148c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
148d0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
148e0 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
148f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14900 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
14910 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
14920 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
14930 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
14940 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
14950 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
14960 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
14970 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
14980 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
14990 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
149a0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
149b0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
149c0 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
149d0 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
149e0 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
149f0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14a00 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
14a10 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
14a20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
14a30 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
14a40 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
14a50 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
14a60 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
14a70 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
14a80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14a90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
14aa0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14ab0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
14ac0 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
14ad0 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
14ae0 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
14af0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
14b00 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
14b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14b20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14b30 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
14b40 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
14b50 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
14b60 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
14b70 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
14b80 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
14b90 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
14ba0 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
14bb0 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
14bc0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
14bd0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
14be0 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
14bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
14c00 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
14c10 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
14c20 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
14c30 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
14c40 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
14c50 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
14c60 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
14c70 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
14c80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14c90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
14ca0 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
14cb0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14cc0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
14cd0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
14ce0 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
14cf0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14d00 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
14d10 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
14d20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
14d30 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
14d40 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
14d50 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
14d60 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
14d70 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
14d80 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
14d90 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
14da0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
14db0 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
14dc0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
14dd0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
14de0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
14df0 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
14e00 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
14e10 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
14e20 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
14e30 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
14e40 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
14e50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
14e60 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
14e70 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
14e80 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
14e90 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
14ea0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
14eb0 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
14ec0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
14ed0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
14ee0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
14ef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
14f00 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
14f10 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
14f20 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
14f30 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
14f40 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
14f50 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
14f60 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
14f70 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
14f80 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
14f90 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
14fa0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
14fb0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
14fc0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
14fd0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
14fe0 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
14ff0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
15000 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
15010 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
15020 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
15030 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
15040 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
15050 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
15060 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
15070 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
15080 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
15090 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
150a0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
150b0 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
150c0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
150d0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
150e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
150f0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
15100 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
15110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15120 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15130 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
15140 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15150 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15160 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
15170 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
15180 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
15190 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
151a0 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
151b0 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
151c0 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
151d0 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
151e0 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
151f0 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
15200 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
15210 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
15220 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
15230 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
15240 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
15250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
15260 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
15270 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
15280 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15290 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
152a0 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
152b0 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
152c0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
152d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
152e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
152f0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
15300 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
15310 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
15320 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
15330 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
15340 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
15350 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
15360 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
15370 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
15380 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
15390 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
153a0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
153b0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
153c0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
153d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
153e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
153f0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
15400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15410 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
15420 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15430 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
15440 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
15450 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
15460 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
15470 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
15480 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
15490 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
154a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
154b0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
154c0 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
154d0 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
154e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
154f0 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
15500 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
15510 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
15520 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
15530 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
15540 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15550 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
15560 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
15570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15580 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
15590 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
155a0 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
155b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
155c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
155d0 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
155e0 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
155f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
15600 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
15610 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
15620 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
15630 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
15640 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
15650 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
15660 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
15670 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
15680 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
15690 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
156a0 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
156b0 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
156c0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
156d0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
156e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
156f0 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
15700 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
15710 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
15720 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
15730 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
15740 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
15750 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
15760 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
15770 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
15780 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
15790 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
157a0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
157b0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
157c0 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
157d0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
157e0 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
157f0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
15800 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15810 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
15820 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
15830 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
15840 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
15850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15860 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
15870 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
15880 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
15890 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
158a0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
158b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
158c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
158d0 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
158e0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
158f0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
15900 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
15910 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
15920 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
15930 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
15940 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
15950 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
15960 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
15970 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
15980 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
15990 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
159a0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
159b0 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
159c0 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
159d0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
159e0 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
159f0 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
15a00 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
15a10 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
15a20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
15a30 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
15a40 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
15a50 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
15a60 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
15a70 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
15a80 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
15a90 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
15aa0 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
15ab0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
15ac0 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
15ad0 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
15ae0 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
15af0 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
15b00 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
15b10 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
15b20 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
15b30 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
15b40 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
15b50 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
15b60 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
15b70 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
15b80 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
15b90 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
15ba0 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
15bb0 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
15bc0 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
15bd0 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
15be0 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
15bf0 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
15c00 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
15c10 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
15c20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
15c30 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
15c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15c50 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
15c60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
15c70 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
15c80 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
15c90 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
15ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
15cb0 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
15cd0 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
15ce0 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
15cf0 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
15d00 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
15d10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15d20 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
15d30 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
15d40 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
15d50 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
15d60 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
15d70 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
15d80 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
15d90 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
15da0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
15db0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15dc0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
15dd0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
15de0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
15df0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
15e00 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
15e10 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
15e20 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
15e30 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15e40 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
15e50 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
15e60 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
15e70 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
15e80 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
15e90 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
15ea0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
15eb0 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
15ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
15ed0 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
15ee0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
15ef0 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
15f00 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
15f10 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
15f20 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
15f30 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
15f40 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
15f50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
15f60 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
15f70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
15f80 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
15f90 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
15fa0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
15fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15fc0 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
15fd0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
15fe0 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
15ff0 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
16000 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
16010 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
16020 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
16030 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
16040 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16050 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
16060 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16070 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
16080 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16090 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20  >pFree);.#ifdef 
160a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
160b0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
160c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
160d0 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  can; i++){.    s
160e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
160f0 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
16100 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
16110 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16120 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d  aScan);.#endif.}
16130 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
16140 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
16150 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16160 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
16170 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16180 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
16190 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
161a0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
161b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
161c0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
161d0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
161e0 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
161f0 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
16200 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
16210 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
16220 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
16230 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
16240 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
16250 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
16260 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
16270 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
16280 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
16290 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
162a0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
162b0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
162c0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
162d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
162e0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
162f0 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
16300 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
16310 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
16320 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
16330 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
16340 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
16350 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
16360 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
16370 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
16380 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
16390 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
163a0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
163b0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
163c0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
163d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
163e0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
163f0 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
16400 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
16410 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
16420 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
16430 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
16440 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
16450 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
16460 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
16470 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
16480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
16490 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
164a0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
164b0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
164c0 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
164d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
164e0 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
164f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
16500 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16520 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
16530 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
16540 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
16550 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
16560 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
16570 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
16580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
165a0 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
165b0 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
165c0 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
165d0 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
165e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
165f0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16600 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
16610 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
16620 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
16630 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
16640 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
16650 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
16660 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
16670 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
16680 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
16690 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
166a0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
166b0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
166c0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
166d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
166e0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
166f0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
16700 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
16710 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
16720 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
16730 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
16740 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16750 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16760 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
16770 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  ( p->uc.pCursor!
16780 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16790 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
167a0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
167b0 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  .pCursor) );.  r
167c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
167d0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
167e0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73  >uc.pCursor, &is
167f0 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
16800 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
16810 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
16820 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
16830 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
16840 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
16850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
16860 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  k to ensure that
16870 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
16880 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74  alid.  Restore t
16890 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20  he cursor.** if 
168a0 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e  need be.  Return
168b0 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66   any I/O error f
168c0 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20  rom the restore 
168d0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  operation..*/.in
168e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
168f0 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43  sorRestore(VdbeC
16900 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
16910 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
16920 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16930 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
16940 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
16950 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
16960 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
16970 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
16980 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
16990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
169a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
169b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
169c0 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
169d0 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
169e0 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
169f0 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
16a00 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
16a10 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
16a20 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
16a30 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
16a40 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
16a50 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
16a60 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
16a70 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
16a80 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
16a90 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
16aa0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
16ab0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
16ac0 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
16ad0 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
16ae0 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
16af0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
16b00 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
16b10 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16b20 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
16b30 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
16b40 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
16b50 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
16b60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
16b70 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
16b80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
16b90 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
16ba0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
16bb0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
16bc0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16bd0 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
16be0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16bf0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
16c00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
16c10 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
16c20 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
16c30 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16c40 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
16c50 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
16c60 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 72  oveto ){.      r
16c70 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65  eturn handleDefe
16c80 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20  rredMoveto(p);. 
16c90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
16ca0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
16cb0 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
16cc0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
16cd0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
16ce0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  edCursor(p);.   
16cf0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16d10 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
16d20 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
16d30 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16d40 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
16d50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16d60 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
16d70 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
16d80 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
16d90 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
16da0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16db0 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
16dc0 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
16dd0 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
16de0 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
16df0 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
16e00 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
16e10 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
16e20 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
16e30 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
16e40 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
16e50 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
16e60 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
16e70 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
16e80 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
16e90 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
16ea0 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
16eb0 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
16ec0 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
16ed0 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
16ee0 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
16ef0 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
16f00 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
16f10 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
16f20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
16f30 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
16f40 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
16f50 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
16f60 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
16f70 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
16f80 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
16f90 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
16fa0 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
16fb0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
16fc0 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
16fd0 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
16fe0 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
16ff0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
17000 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
17010 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
17020 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
17030 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
17040 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
17050 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
17060 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
17070 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17080 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
17090 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
170b0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
170c0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
170d0 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
170e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
170f0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
17100 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17110 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
17140 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17150 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
17160 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
17170 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17180 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
171b0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
171c0 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
171e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
171f0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17200 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
17210 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
17220 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17230 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17260 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
17270 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17280 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17290 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
172a0 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
172b0 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
172c0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
172d0 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
172e0 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
172f0 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
17320 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
17330 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
17340 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
17350 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
17360 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
17370 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
17380 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
17390 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
173a0 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
173b0 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
173c0 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
173d0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
173e0 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
173f0 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
17400 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
17410 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
17420 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
17430 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
17440 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
17450 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17460 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
17470 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
17480 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20  , u32 *pLen){.  
17490 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
174a0 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e  ->flags;.  u32 n
174b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  ;..  assert( pLe
174c0 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c  n!=0 );.  if( fl
174d0 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
174e0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
174f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17500 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
17510 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
17520 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
17530 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
17540 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
17550 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
17560 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
17570 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
17580 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
17590 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
175a0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
175b0 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
175c0 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
175d0 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
175e0 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
175f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26  ){.      if( (i&
17600 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
17610 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20  rmat>=4 ){.     
17620 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
17630 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
17640 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c  u32)u;.      }el
17650 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65  se{.        *pLe
17660 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  n = 1;.        r
17670 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
17680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
17690 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e  <=32767 ){ *pLen
176a0 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20   = 2; return 2; 
176b0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  }.    if( u<=838
176c0 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  8607 ){ *pLen = 
176d0 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20  3; return 3; }. 
176e0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
176f0 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  3647 ){ *pLen = 
17700 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20  4; return 4; }. 
17710 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
17720 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36  YTE ){ *pLen = 6
17730 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20  ; return 5; }.  
17740 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
17750 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
17760 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
17770 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  eal ){.    *pLen
17780 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
17790 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
177a0 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
177b0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
177c0 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
177d0 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74  lob) );.  assert
177e0 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a  ( pMem->n>=0 );.
177f0 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d    n = (u32)pMem-
17800 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
17810 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
17820 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
17830 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65  Zero;.  }.  *pLe
17840 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  n = n;.  return 
17850 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
17860 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
17870 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0));.}../*.** Th
17880 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69  e sizes for seri
17890 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68  al types less th
178a0 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63  an 128.*/.static
178b0 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65   const u8 sqlite
178c0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
178d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
178e0 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33 20    0   1   2   3 
178f0 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37 20    4   5   6   7 
17900 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a    8   9 */   ./*
17910 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c     0 */   0,  1,
17920 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c    2,  3,  4,  6,
17930 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c    8,  8,  0,  0,
17940 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20  ./*  10 */   0, 
17950 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20   0,  0,  0,  1, 
17960 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20   1,  2,  2,  3, 
17970 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20   3,./*  20 */   
17980 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20  4,  4,  5,  5,  
17990 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20  6,  6,  7,  7,  
179a0 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f  8,  8,./*  30 */
179b0 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30     9,  9, 10, 10
179c0 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32  , 11, 11, 12, 12
179d0 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30  , 13, 13,./*  40
179e0 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c   */  14, 14, 15,
179f0 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c   15, 16, 16, 17,
17a00 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20   17, 18, 18,./* 
17a10 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20   50 */  19, 19, 
17a20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20  20, 20, 21, 21, 
17a30 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a  22, 22, 23, 23,.
17a40 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32  /*  60 */  24, 2
17a50 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32  4, 25, 25, 26, 2
17a60 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32  6, 27, 27, 28, 2
17a70 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39  8,./*  70 */  29
17a80 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31  , 29, 30, 30, 31
17a90 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33  , 31, 32, 32, 33
17aa0 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20  , 33,./*  80 */ 
17ab0 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c   34, 34, 35, 35,
17ac0 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c   36, 36, 37, 37,
17ad0 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20   38, 38,./*  90 
17ae0 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20  */  39, 39, 40, 
17af0 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20  40, 41, 41, 42, 
17b00 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31  42, 43, 43,./* 1
17b10 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34  00 */  44, 44, 4
17b20 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34  5, 45, 46, 46, 4
17b30 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f  7, 47, 48, 48,./
17b40 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39  * 110 */  49, 49
17b50 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31  , 50, 50, 51, 51
17b60 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33  , 52, 52, 53, 53
17b70 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c  ,./* 120 */  54,
17b80 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c   54, 55, 55, 56,
17b90 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a   56, 57, 57.};..
17ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17bb0 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
17bc0 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
17bd0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
17be0 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
17bf0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
17c00 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
17c10 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
17c20 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
17c30 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72  pe>=128 ){.    r
17c40 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
17c50 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
17c60 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e{.    assert( s
17c70 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20  erial_type<12 . 
17c80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
17c90 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
17ca0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
17cb0 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  ==(serial_type -
17cc0 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65   12)/2 );.    re
17cd0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
17ce0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
17cf0 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75  l_type];.  }.}.u
17d00 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65  8 sqlite3VdbeOne
17d10 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65  ByteSerialTypeLe
17d20 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65  n(u8 serial_type
17d30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 72  ){.  assert( ser
17d40 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a  ial_type<128 );.
17d50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17d60 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17d70 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d  erial_type];  .}
17d80 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
17d90 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
17da0 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
17db0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
17dc0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
17dd0 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
17de0 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
17df0 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
17e00 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
17e10 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
17e20 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
17e30 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
17e40 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
17e50 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
17e60 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
17e70 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
17e80 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
17e90 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
17ea0 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
17eb0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
17ec0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
17ed0 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
17ee0 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
17ef0 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
17f00 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
17f10 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
17f20 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
17f30 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
17f40 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
17f50 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
17f60 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
17f70 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
17f80 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
17f90 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
17fa0 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
17fb0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
17fc0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
17fd0 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
17fe0 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
17ff0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
18000 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
18010 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
18020 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
18030 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
18040 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
18050 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
18060 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
18070 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
18080 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
18090 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
180a0 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
180b0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
180c0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
180d0 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
180e0 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
180f0 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
18100 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
18110 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
18120 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
18130 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
18140 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
18150 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
18160 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
18170 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
18180 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
18190 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
181a0 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
181b0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
181c0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
181d0 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
181e0 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
181f0 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
18200 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
18210 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
18220 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
18230 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
18240 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
18250 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
18260 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
18270 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
18280 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
18290 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
182a0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
182b0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
182c0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
182d0 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
182e0 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
182f0 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
18300 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
18310 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
18320 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
18330 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
18340 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
18350 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
18360 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
18370 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
18380 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
18390 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
183a0 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
183b0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
183c0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
183d0 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
183e0 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
183f0 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
18400 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
18410 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
18420 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
18430 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
18440 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
18450 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
18460 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
18470 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
18480 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
18490 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
184a0 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
184b0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
184c0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
184d0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
184e0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
184f0 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
18500 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
18510 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
18520 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
18530 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
18540 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
18550 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
18560 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
18570 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
18580 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
18590 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
185a0 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
185b0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
185c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
185d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
185e0 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
185f0 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
18600 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
18610 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61  n buf[].  The ca
18620 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
18630 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63  ble.** for alloc
18640 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61  ating enough spa
18650 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68  ce to buf[] to h
18660 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
18670 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a  ield, exclusive.
18680 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e  ** of the pMem->
18690 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f  u.nZero bytes fo
186a0 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c  r a MEM_Zero val
186b0 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ue..**.** Return
186c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
186d0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
186e0 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
186f0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
18700 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
18710 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
18720 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
18730 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
18740 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
18750 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
18760 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
18770 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
18780 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
18790 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  buf, Mem *pMem, 
187a0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
187b0 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  {.  u32 len;..  
187c0 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
187d0 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
187e0 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
187f0 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
18800 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
18810 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
18820 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
18830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
18840 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
18850 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20  pMem->u.r) );.  
18860 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
18870 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f  pMem->u.r, sizeo
18880 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
18890 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
188a0 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
188b0 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
188c0 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
188d0 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
188e0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
188f0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
18900 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
18910 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
18920 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
18930 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
18940 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
18950 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
18960 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
18970 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
18980 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
18990 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
189a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
189b0 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
189c0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
189d0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
189e0 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
189f0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
18a00 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
18a10 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
18a20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
18a30 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d     if( len>0 ) m
18a40 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
18a50 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
18a60 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
18a70 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
18a80 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
18a90 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18aa0 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
18ab0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
18ac0 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
18ad0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
18ae0 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
18af0 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
18b00 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
18b10 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
18b20 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
18b30 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
18b40 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
18b50 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
18b60 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
18b70 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
18b80 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
18b90 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
18ba0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
18bb0 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
18bc0 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
18bd0 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
18be0 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
18bf0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
18c00 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
18c10 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
18c20 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
18c30 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
18c40 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
18c50 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
18c60 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
18c70 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
18c80 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
18c90 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
18ca0 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
18cb0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
18cc0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
18cd0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
18ce0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
18cf0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
18d00 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
18d10 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
18d20 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
18d30 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
18d40 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
18d50 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
18d60 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
18d70 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
18d80 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
18d90 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
18da0 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
18db0 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
18dc0 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
18dd0 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
18de0 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
18df0 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
18e00 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
18e10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
18e20 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
18e30 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
18e40 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
18e50 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
18e60 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
18e70 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
18e80 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
18e90 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18eb0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
18ec0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
18ed0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
18ee0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
18ef0 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
18f00 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
18f10 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
18f20 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
18f30 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
18f40 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  =6 ){.    /* EVI
18f50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35  DENCE-OF: R-2985
18f60 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73  1-52272 Value is
18f70 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34   a big-endian 64
18f80 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73  -bit.    ** twos
18f90 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
18fa0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  ger. */.    pMem
18fb0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
18fc0 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
18fd0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18fe0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
18ff0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
19000 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
19010 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d  NCE-OF: R-57343-
19020 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61  49114 Value is a
19030 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45   big-endian IEEE
19040 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74   754-2008 64-bit
19050 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67  .    ** floating
19060 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
19070 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
19080 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
19090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
190a0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
190b0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
190c0 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
190d0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
190e0 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
190f0 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
19100 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
19110 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
19120 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
19130 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
19140 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
19150 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19160 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
19170 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
19180 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
19190 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
191a0 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
191b0 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
191c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
191d0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
191e0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
191f0 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19200 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
19210 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19220 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
19230 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
19240 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
19250 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
19260 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19270 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
19280 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
19290 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
192a0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
192b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
192c0 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
192d0 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
192e0 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
192f0 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
19300 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
19310 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
19320 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
19330 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19340 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
19350 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
19360 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
19370 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
19380 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
19390 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
193a0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
193b0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
193c0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
193d0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
193e0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
193f0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
19400 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
19410 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
19420 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
19430 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
19440 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
19450 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
19460 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
19470 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
19480 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
19490 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20   /* Null */.    
194a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
194b0 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20  : R-24078-09375 
194c0 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e  Value is a NULL.
194d0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
194e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
194f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19500 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
19510 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
19520 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35  ENCE-OF: R-44885
19530 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20  -25196 Value is 
19540 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f  an 8-bit twos-co
19550 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  mplement.      *
19560 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  * integer. */.  
19570 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19580 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  ONE_BYTE_INT(buf
19590 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
195a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
195b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
195c0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
195d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
195e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
195f0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
19600 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19610 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19620 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30  -OF: R-49794-350
19630 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  26 Value is a bi
19640 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a  g-endian 16-bit.
19650 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19660 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19670 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19680 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f  >u.i = TWO_BYTE_
19690 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
196a0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
196b0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
196c0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
196d0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
196e0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
196f0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
19700 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19710 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19720 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
19730 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20  839-54301 Value 
19740 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19750 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  24-bit.      ** 
19760 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19770 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19780 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
19790 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
197a0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
197b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
197c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
197d0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
197e0 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
197f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
19800 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
19810 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19820 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19830 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30  -OF: R-01849-260
19840 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  79 Value is a bi
19850 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a  g-endian 32-bit.
19860 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19870 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19880 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19890 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
198a0 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65  _INT(buf);.#ifde
198b0 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20  f __HP_cc .     
198c0 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20   /* Work around 
198d0 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e  a sign-extension
198e0 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63   bug in the HP c
198f0 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55  ompiler for HP/U
19900 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  X */.      if( b
19910 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65  uf[0]&0x80 ) pMe
19920 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66  m->u.i |= 0xffff
19930 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a  ffff80000000LL;.
19940 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65  #endif.      pMe
19950 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
19960 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
19970 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19980 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19990 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
199a0 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
199b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
199c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
199d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35  ENCE-OF: R-50385
199e0 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20  -09674 Value is 
199f0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d  a big-endian 48-
19a00 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
19a10 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19a20 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19a30 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
19a40 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29  BYTE_UINT(buf+2)
19a50 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
19a60 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  )*TWO_BYTE_INT(b
19a70 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
19a80 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19a90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19aa0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
19ac0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19ad0 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
19ae0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19af0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
19b00 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
19b10 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  point */.      /
19b20 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61  * These use loca
19b30 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20  l variables, so 
19b40 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70  do them in a sep
19b50 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20  arate routine.  
19b60 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
19b70 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74  having to move t
19b80 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72  he frame pointer
19b90 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19ba0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ase */.      ret
19bb0 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75  urn serialGet(bu
19bc0 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d  f,serial_type,pM
19bd0 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  em);.    }.    c
19be0 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
19bf0 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
19c00 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
19c10 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f  ger 1 */.      /
19c20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19c30 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c  -12976-22893 Val
19c40 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
19c50 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  r 0. */.      /*
19c60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c70 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75  18143-12121 Valu
19c80 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
19c90 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   1. */.      pMe
19ca0 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
19cb0 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
19cc0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19cd0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
19ce0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
19cf0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
19d00 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19d10 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61  R-14606-31564 Va
19d20 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68  lue is a BLOB th
19d30 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62  at is (N-12)/2 b
19d40 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ytes in.      **
19d50 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a   length..      *
19d60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19d70 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c  -28401-00140 Val
19d80 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  ue is a string i
19d90 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64  n the text encod
19da0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ing and.      **
19db0 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20   (N-13)/2 bytes 
19dc0 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20  in length. */.  
19dd0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19de0 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b   u16 aFlag[] = {
19df0 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
19e00 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  hem, MEM_Str|MEM
19e10 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20  _Ephem };.      
19e20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
19e30 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
19e40 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m->n = (serial_t
19e50 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
19e60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
19e70 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
19e80 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
19e90 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d  n pMem->n;.    }
19ea0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19eb0 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .}./*.** This ro
19ec0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
19ed0 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
19ee0 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
19ef0 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
19f00 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
19f10 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
19f20 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
19f30 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
19f40 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
19f50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
19f60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
19f70 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
19f80 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
19f90 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
19fa0 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
19fb0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
19fc0 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
19fd0 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
19fe0 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
19ff0 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
1a000 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
1a010 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
1a020 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
1a030 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
1a040 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
1a050 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
1a060 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
1a070 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
1a080 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
1a090 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1a0a0 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
1a0b0 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
1a0c0 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
1a0d0 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
1a0e0 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
1a0f0 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
1a100 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
1a110 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1a120 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1a130 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
1a140 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
1a150 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
1a160 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
1a170 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
1a180 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a190 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a1a0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1a1b0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
1a1c0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
1a1f0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
1a200 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
1a230 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
1a240 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
1a250 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
1a260 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
1a270 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
1a280 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
1a290 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1a2a0 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1a2b0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1a2c0 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1a2d0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
1a2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a2f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1a300 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
1a310 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
1a320 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a350 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1a360 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
1a370 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
1a380 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
1a390 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
1a3a0 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
1a3b0 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
1a3c0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
1a3d0 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
1a3e0 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
1a3f0 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
1a400 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
1a410 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
1a420 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
1a430 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
1a440 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
1a450 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
1a460 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
1a470 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
1a480 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
1a490 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1a4a0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1a4b0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1a4c0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1a4d0 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
1a4e0 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
1a4f0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
1a500 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
1a510 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
1a520 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
1a530 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
1a540 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
1a550 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1a560 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
1a570 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
1a580 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
1a590 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
1a5a0 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
1a5b0 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1a5c0 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1a5d0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1a5e0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1a5f0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1a600 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1a610 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1a620 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1a630 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1a640 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1a650 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1a660 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1a670 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1a680 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1a690 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1a6a0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a6b0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1a6c0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1a6d0 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1a6e0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1a6f0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1a700 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1a710 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a720 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1a730 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a740 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1a750 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1a760 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1a770 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1a780 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a790 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1a7a0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1a7b0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1a7c0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1a7d0 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1a7e0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1a7f0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1a800 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1a810 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1a820 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1a830 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1a840 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1a850 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1a860 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1a870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a880 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1a890 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1a8a0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1a8b0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a8d0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1a8e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1a8f0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1a900 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1a910 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1a920 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1a930 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1a940 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1a950 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1a960 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1a970 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1a980 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1a990 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1a9a0 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1a9b0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1a9c0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1a9d0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1a9e0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1a9f0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1aa00 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1aa10 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1aa20 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1aa30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1aa40 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1aa50 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1aa60 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1aa70 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1aa80 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
1aa90 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1aaa0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
1aab0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1aac0 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
1aad0 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29  +;.    if( (++u)
1aae0 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72  >=p->nField ) br
1aaf0 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  eak;.  }.  asser
1ab00 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1ab10 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
1ab20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
1ab30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1ab40 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
1ab50 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1ab60 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62  two index or tab
1ab70 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69  le record keys i
1ab80 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a  n the same way.*
1ab90 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  * as the sqlite3
1aba0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1abb0 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c  e() routine. Unl
1abc0 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ike VdbeRecordCo
1abd0 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73  mpare(),.** this
1abe0 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1abf0 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61  alizes and compa
1ac00 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67  res values using
1ac10 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56   the.** sqlite3V
1ac20 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
1ac30 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nd sqlite3MemCom
1ac40 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73  pare() functions
1ac50 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  . It is used.** 
1ac60 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1ac70 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
1ac80 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
1ac90 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73  zed code in.** s
1aca0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1acb0 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e  Compare() return
1acc0 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74  s results with t
1acd0 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69  hese two primiti
1ace0 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ves..**.** Retur
1acf0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
1ad00 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
1ad10 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
1ad20 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c   to desiredResul
1ad30 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  t..** Return fal
1ad40 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  se if there is a
1ad50 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a   disagreement..*
1ad60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1ad70 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1ad80 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  bug(.  int nKey1
1ad90 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ada0 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1adb0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61   */.  const Unpa
1adc0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1add0 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79  y2, /* Right key
1ade0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65   */.  int desire
1adf0 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  dResult         
1ae00 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61      /* Correct a
1ae10 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33  nswer */.){.  u3
1ae20 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1ae30 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1ae40 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1ae50 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1ae60 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1ae70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1ae80 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1ae90 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
1aea0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1aeb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1aec0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
1aed0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
1aee0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1aef0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
1af00 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1af10 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1af20 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1af30 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1af40 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
1af50 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
1af60 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1af70 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1af80 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
1af90 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d   1;.  mem1.enc =
1afa0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1afb0 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1afc0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
1afd0 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
1afe0 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
1aff0 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
1b000 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1b010 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
1b020 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1b030 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1b040 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1b050 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
1b060 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
1b070 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
1b080 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
1b090 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
1b0a0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
1b0b0 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
1b0c0 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
1b0d0 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
1b0e0 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
1b0f0 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
1b100 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
1b110 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
1b120 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
1b130 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
1b140 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
1b150 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
1b160 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
1b170 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
1b180 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
1b190 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
1b1a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1b1b0 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
1b1c0 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
1b1d0 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
1b1e0 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
1b1f0 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
1b200 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
1b210 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
1b220 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
1b230 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
1b240 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
1b250 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
1b260 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
1b270 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
1b280 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1b290 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64  dr1);.  if( szHd
1b2a0 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72  r1>98307 ) retur
1b2b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b2c0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
1b2d0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b2e0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1b2f0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1b300 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
1b310 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1b320 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1b330 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1b340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1b350 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1b360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1b370 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1b380 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1b390 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1b3a0 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1b3b0 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1b3c0 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1b3d0 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1b3e0 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1b3f0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1b400 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1b410 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1b420 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1b430 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1b440 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1b450 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1b460 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1b470 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1b480 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1b490 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1b4a0 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1b4b0 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1b4c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1b4d0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1b4e0 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1b4f0 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1b500 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1b510 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1b520 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1b530 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1b540 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1b550 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1b560 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1b570 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72  /.    if( d1+ser
1b580 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32  ial_type1+2>(u32
1b590 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
1b5a0 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  1+sqlite3VdbeSer
1b5b0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1b5c0 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b  l_type1)>(u32)nK
1b5d0 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ey1 .    ){.    
1b5e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1b5f0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1b600 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
1b610 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
1b620 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1b630 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b640 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1b650 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
1b660 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
1b670 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
1b680 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b690 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
1b6a0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
1b6b0 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d  em[i], pKeyInfo-
1b6c0 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aColl[i]);.    
1b6d0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1b6e0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1b6f0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1b700 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1b710 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66  elow */.      if
1b720 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1b730 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1b740 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20       rc = -rc;  
1b750 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
1b760 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f  sult for DESC so
1b770 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
1b780 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1b790 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b  debugCompareEnd;
1b7a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
1b7b0 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73    }while( idx1<s
1b7c0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1b7d0 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20  2->nField );..  
1b7e0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1b7f0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1b800 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1b810 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1b820 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1b830 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1b840 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1b850 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1b860 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1b870 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1b880 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1b890 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1b8a0 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
1b8b0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1b8c0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1b8d0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1b8e0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1b8f0 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1b900 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1b910 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1b920 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1b930 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1b940 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1b950 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1b960 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d  /.  rc = pPKey2-
1b970 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65  >default_rc;..de
1b980 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20  bugCompareEnd:. 
1b990 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1b9a0 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29  lt==0 && rc==0 )
1b9b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1b9c0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30   desiredResult<0
1b9d0 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72   && rc<0 ) retur
1b9e0 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1b9f0 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63  edResult>0 && rc
1ba00 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  >0 ) return 1;. 
1ba10 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1ba20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1ba30 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ( pKeyInfo->db->
1ba40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1ba50 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
1ba60 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
1ba70 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1ba80 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1ba90 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1baa0 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73   (a.k.a. columns
1bab0 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  ) in the record 
1bac0 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79  given by.** pKey
1bad0 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69  ,nKey.  The veri
1bae0 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75  fy that this cou
1baf0 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  nt is less than 
1bb00 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1bb10 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62  ** limit given b
1bb20 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  y pKeyInfo->nFie
1bb30 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld + pKeyInfo->n
1bb40 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  XField..**.** If
1bb50 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1bb60 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
1bb70 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d, it means that
1bb80 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a   the high-speed.
1bb90 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  ** vdbeRecordCom
1bba0 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64  pareInt() and vd
1bbb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1bbc0 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73  tring() routines
1bbd0 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
1bbe0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66  k correctly.  If
1bbf0 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65   this assert() e
1bc00 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72  ver fires, it pr
1bc10 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20  obably means.** 
1bc20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f  that the KeyInfo
1bc30 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e  .nField or KeyIn
1bc40 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65  fo.nXField value
1bc50 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a  s were computed.
1bc60 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ** incorrectly..
1bc70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
1bc80 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1bc90 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1bca0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
1bcb0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1bcc0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74   /* The record t
1bcd0 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63  o verify */ .  c
1bce0 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
1bcf0 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20  eyInfo       /* 
1bd00 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74  Compare size wit
1bd10 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a  h this KeyInfo *
1bd20 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  /.){.  int nFiel
1bd30 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48  d = 0;.  u32 szH
1bd40 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20  dr;.  u32 idx;. 
1bd50 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20   u32 notUsed;.  
1bd60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bd70 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1bd80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bd90 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43  *)pKey;..  if( C
1bda0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1bdb0 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56  rn;.  idx = getV
1bdc0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1bdd0 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr);.  assert( 
1bde0 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
1bdf0 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32  ert( szHdr<=(u32
1be00 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65  )nKey );.  while
1be10 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20  ( idx<szHdr ){. 
1be20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1be30 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20  int32(aKey+idx, 
1be40 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46  notUsed);.    nF
1be50 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73  ield++;.  }.  as
1be60 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20  sert( nField <= 
1be70 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1be80 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
1be90 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1bea0 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1beb0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1bec0 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1bed0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1bee0 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1bef0 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1bf00 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1bf10 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1bf20 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1bf30 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1bf40 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1bf50 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1bf60 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1bf70 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1bf80 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1bf90 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1bfa0 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1bfb0 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1bfc0 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1bfd0 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1bfe0 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1bff0 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1c000 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1c010 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1c020 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1c030 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1c040 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1c050 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1c060 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1c090 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1c0a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1c0b0 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1c0c0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1c0d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1c0e0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1c0f0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1c100 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1c110 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1c120 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1c130 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1c140 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1c150 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1c160 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1c170 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1c180 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1c190 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c1a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1c1b0 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c  *v2;.    int n1,
1c1c0 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b   n2;.    Mem c1;
1c1d0 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1c1e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1c1f0 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1c200 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1c210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c220 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1c230 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1c240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c250 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1c260 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1c270 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1c280 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1c290 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1c2a0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1c2b0 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1c2c0 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1c2d0 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1c2e0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20  l->enc);.    n1 
1c2f0 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31  = v1==0 ? 0 : c1
1c300 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  .n;.    v2 = sql
1c310 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1c320 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1c330 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  2, pColl->enc);.
1c340 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f      n2 = v2==0 ?
1c350 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72   0 : c2.n;.    r
1c360 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
1c370 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31  pColl->pUser, n1
1c380 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20  , v1, n2, v2);. 
1c390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c3a0 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1c3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c3c0 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1c3d0 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1c3e0 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72   v2==0) && prcEr
1c3f0 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1c400 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d  return rc;.  }.}
1c420 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1c430 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75  two blobs.  Retu
1c440 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1c450 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1c460 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
1c470 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1c480 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1c490 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1c4a0 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  d, respectively.
1c4b0 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20  .** If one blob 
1c4c0 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
1c4d0 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74  he other, then t
1c4e0 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68  he shorter is th
1c4f0 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e lessor..*/.sta
1c500 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
1c510 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1c520 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1c530 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1c540 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1c550 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31  t c = memcmp(pB1
1c560 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31  ->z, pB2->z, pB1
1c570 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32  ->n>pB2->n ? pB2
1c580 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20  ->n : pB1->n);. 
1c590 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20   if( c ) return 
1c5a0 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d  c;.  return pB1-
1c5b0 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a  >n - pB2->n;.}..
1c5c0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1c5d0 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1c5e0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1c5f0 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1c600 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1c610 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1c620 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1c630 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1c640 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1c650 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1c660 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1c670 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1c680 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1c690 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1c6a0 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1c6b0 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1c6c0 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1c6d0 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1c6e0 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1c6f0 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1c700 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1c710 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1c720 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1c730 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1c740 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1c750 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1c760 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1c770 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1c780 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1c790 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1c7a0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1c7b0 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35  ( r>922337203685
1c7c0 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75  4775807.0 ) retu
1c7d0 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1c7e0 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1c7f0 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1c800 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20      if( i>y ){. 
1c810 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c       if( y==SMAL
1c820 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e  LEST_INT64 && r>
1c830 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  0.0 ) return -1;
1c840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31  .      return +1
1c850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
1c860 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69  (double)i;.    i
1c870 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20  f( s<r ) return 
1c880 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20  -1;.    if( s>r 
1c890 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1c8a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1c8b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1c8c0 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1c8d0 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1c8e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1c8f0 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1c900 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1c910 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1c920 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1c930 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1c940 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1c950 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1c960 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1c970 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1c980 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1c990 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1c9a0 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1c9b0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1c9c0 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1c9d0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1c9e0 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1c9f0 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1ca00 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1ca10 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1ca20 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1ca30 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1ca40 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1ca50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1ca60 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1ca70 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1ca80 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1ca90 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1caa0 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1cab0 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1cac0 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1cad0 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1cae0 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1caf0 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1cb00 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1cb10 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1cb20 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1cb30 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1cb40 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1cb50 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1cb60 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1cb70 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1cb80 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1cb90 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1cba0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1cbb0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1cbc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1cbd0 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1cbe0 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1cbf0 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f  .  /* At least o
1cc00 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61  ne of the two va
1cc10 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72  lues is a number
1cc20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1cc30 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1cc40 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1cc50 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1cc60 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
1cc70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1cc80 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
1cc90 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
1cca0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1ccb0 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
1ccc0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
1ccd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1cce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1ccf0 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
1cd00 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1cd10 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
1cd20 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1cd30 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1cd40 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
1cd50 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1cd60 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1cd70 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1cd80 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e    if( (f1&MEM_In
1cd90 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1cda0 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1cdb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1cdc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
1cdd0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1cde0 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
1cdf0 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1ce00 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1ce10 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1ce20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1ce30 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ce40 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1ce50 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1ce60 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c       return -sql
1ce70 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1ce80 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20  are(pMem2->u.i, 
1ce90 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem1->u.r);.   
1cea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ceb0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1cec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1ced0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20  eturn +1;.  }.. 
1cee0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1cef0 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
1cf00 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
1cf10 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
1cf20 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1cf30 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
1cf40 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
1cf50 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
1cf60 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
1cf70 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1cf80 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
1cf90 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
1cfa0 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1cfb0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1cfc0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
1cfd0 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1cfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1cff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1d000 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1d010 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20  pMem2->enc );.  
1d020 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1d030 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d040 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1d050 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1d060 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1d070 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d080 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1d090 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1d0a0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1d0b0 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1d0c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1d0d0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1d0e0 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1d0f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d100 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1d110 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1d120 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1d130 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1d140 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1d150 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d160 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1d170 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1d180 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1d190 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1d1a0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1d1b0 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1d1c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1d1d0 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1d1e0 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1d1f0 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1d200 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1d210 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1d220 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1d230 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1d240 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1d250 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1d260 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1d270 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1d280 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1d290 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1d2a0 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1d2b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1d2c0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1d2d0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1d2e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1d2f0 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1d300 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1d310 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1d320 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1d330 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1d340 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1d350 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1d360 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1d370 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1d380 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1d390 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1d3a0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1d3b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1d3c0 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1d3d0 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1d3e0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1d3f0 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1d400 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1d410 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1d420 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1d430 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1d440 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1d450 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1d460 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1d470 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1d480 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1d490 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1d4a0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1d4b0 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1d4c0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d4d0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d4e0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1d4f0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1d500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d510 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1d530 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1d540 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1d550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d560 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d570 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1d580 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d590 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1d5a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d5b0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d5c0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1d5d0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d5e0 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1d5f0 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1d600 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1d610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d620 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d630 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1d640 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d650 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1d660 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1d670 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1d680 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1d690 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1d6a0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1d6b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d6c0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d6d0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1d6e0 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1d6f0 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1d700 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d710 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1d720 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1d730 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1d740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d750 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1d760 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1d770 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1d780 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1d790 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1d7a0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1d7b0 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1d7c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1d7d0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1d7e0 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1d7f0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1d800 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1d810 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1d820 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1d830 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1d840 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1d850 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1d860 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1d870 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1d880 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1d890 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1d8a0 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1d8b0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1d8c0 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1d8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1d8e0 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1d8f0 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1d900 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1d910 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1d920 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1d930 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1d940 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1d950 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1d960 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1d970 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1d980 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1d990 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1d9a0 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1d9b0 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1d9c0 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1d9d0 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1d9e0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1d9f0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1da00 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1da10 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1da20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1da30 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1da40 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1da50 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1da60 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1da70 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1da80 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1da90 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1daa0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1dab0 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1dac0 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1dad0 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1dae0 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1daf0 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1db00 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1db10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1db20 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1db30 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1db40 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1db50 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1db60 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1db70 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1db80 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1db90 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1dba0 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dbc0 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1dbd0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1dbe0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1dc10 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1dc20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1dc30 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1dc60 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1dc70 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1dc80 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dca0 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1dcb0 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1dcc0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1dcf0 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1dd00 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1dd10 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dd30 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1dd40 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1dd50 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1dd60 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1dd70 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1dd80 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1dd90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1dda0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1ddb0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1ddc0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1ddd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1dde0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1ddf0 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1de00 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1de10 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1de20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1de30 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1de40 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1de50 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1de60 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1de70 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1de80 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1de90 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1dea0 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1deb0 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1dec0 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1ded0 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1dee0 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1def0 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1df00 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1df10 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1df20 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1df30 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1df40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1df50 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1df60 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1df70 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1df80 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1df90 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1dfa0 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1dfb0 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1dfc0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1dfd0 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1dfe0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1dff0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1e000 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1e010 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1e020 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e030 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1e040 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1e050 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1e060 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1e070 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1e080 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1e090 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e0a0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65  nfo->nField+pPKe
1e0b0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1e0c0 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1e0d0 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1e0e0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1e0f0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e100 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1e110 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1e120 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e130 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1e140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1e150 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1e160 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1e170 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1e180 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1e190 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1e1a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1e1b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1e1c0 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1e1d0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1e1e0 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1e1f0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e200 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e210 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1e220 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
1e230 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e240 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e250 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1e260 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e270 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e280 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1e290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1e2a0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1e2b0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1e2c0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1e2d0 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
1e2e0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1e2f0 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
1e300 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1e310 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1e320 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1e330 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1e340 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1e350 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1e360 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1e370 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1e380 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e390 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e3a0 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1e3b0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e3c0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e3d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e3e0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e3f0 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1e400 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e410 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1e420 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1e430 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1e440 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e450 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1e460 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1e470 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
1e480 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
1e490 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
1e4a0 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
1e4b0 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
1e4c0 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
1e4d0 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
1e4e0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
1e4f0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
1e500 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
1e510 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
1e520 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
1e530 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
1e540 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
1e550 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
1e560 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
1e570 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1e580 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e590 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1e5a0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e5c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e5d0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e5e0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e5f0 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1e600 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e620 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
1e630 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1e640 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e650 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e660 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
1e670 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1e680 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e6b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
1e6c0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
1e6d0 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
1e6e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e700 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1e710 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1e720 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e730 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1e740 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1e750 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1e760 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1e770 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1e780 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1e790 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e7a0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1e7b0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e7c0 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1e7d0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1e7e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e7f0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1e800 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1e810 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1e820 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1e830 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1e840 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1e850 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1e860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1e870 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1e880 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1e890 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1e8a0 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1e8b0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1e8c0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1e8d0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1e8e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1e900 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e910 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1e920 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1e930 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1e940 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1e950 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1e960 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1e970 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1e980 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1e990 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1e9a0 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1e9b0 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1e9c0 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1e9d0 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1e9e0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1e9f0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1ea10 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1ea20 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1ea30 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1ea40 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1ea50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea60 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1ea70 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1ea80 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1ea90 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1eaa0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1eab0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1eac0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1ead0 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1eae0 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1eaf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1eb00 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1eb10 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1eb20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1eb30 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1eb40 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1eb50 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1eb60 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1eb70 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1eb80 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1eb90 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1eba0 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1ebb0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1ebc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ebd0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1ebe0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1ebf0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1ec00 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1ec10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ec20 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1ec30 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ec40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ec50 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1ec60 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ec70 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1ec80 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1ec90 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1eca0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ecb0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1ecc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ecd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1ece0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ecf0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ed00 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1ed10 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1ed20 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1ed30 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1ed40 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1ed50 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1ed60 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1ed70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1ed80 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1ed90 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1eda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1edb0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1edc0 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1edd0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1ede0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1edf0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1ee00 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1ee10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1ee20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1ee30 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1ee40 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1ee50 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1ee60 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1ee70 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1ee80 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1ee90 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1eea0 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1eeb0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1eec0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1eed0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1eee0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1eef0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1ef00 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1ef10 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1ef20 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1ef30 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1ef40 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1ef50 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1ef60 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1ef70 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1ef80 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1ef90 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1efa0 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1efb0 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1efc0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1efd0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1efe0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1eff0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1f000 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1f010 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1f020 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1f030 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1f040 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1f050 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1f060 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1f070 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1f080 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f090 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1f0a0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1f0b0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1f0c0 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1f0d0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1f0e0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1f0f0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1f100 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1f110 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1f120 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1f130 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1f140 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1f150 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1f160 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1f170 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1f180 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f190 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1f1a0 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1f1b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1f1c0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1f1d0 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
1f1e0 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
1f1f0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f200 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1f210 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f220 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1f230 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f240 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1f250 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1f260 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1f270 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1f280 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1f290 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1f2a0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1f2b0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1f2c0 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
1f2d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f2e0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1f2f0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1f300 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f310 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1f320 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1f330 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1f340 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1f350 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1f360 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1f370 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1f380 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1f390 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1f3a0 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1f3b0 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1f3c0 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1f3d0 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1f3e0 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1f3f0 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1f400 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1f410 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1f420 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1f430 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1f440 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1f450 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1f460 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1f470 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1f480 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1f490 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1f4a0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1f4b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1f4c0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1f4d0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1f4e0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1f4f0 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1f500 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1f510 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1f520 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1f530 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1f540 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1f550 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1f560 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1f570 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1f580 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1f590 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1f5a0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1f5b0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1f5c0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1f5d0 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
1f5e0 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
1f5f0 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
1f600 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
1f610 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1f620 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
1f630 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
1f640 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f650 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
1f660 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f670 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f680 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f690 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1f6a0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1f6b0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f6c0 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
1f6d0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f6e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6f0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f700 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f710 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1f720 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f730 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f740 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1f750 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f760 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1f790 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1f7a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f7b0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1f7c0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f7d0 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
1f7e0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
1f7f0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f800 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f810 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1f820 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1f830 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f840 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
1f850 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1f860 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1f870 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1f880 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f890 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f8a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f8b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1f8c0 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
1f8d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f8e0 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
1f8f0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f900 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1f910 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1f920 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1f930 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
1f940 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f950 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1f960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f970 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
1f980 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
1f990 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
1f9a0 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
1f9b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1f9c0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1f9d0 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
1f9e0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
1f9f0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
1fa00 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
1fa10 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
1fa20 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
1fa30 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
1fa40 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
1fa50 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
1fa60 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
1fa70 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
1fa80 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
1fa90 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
1faa0 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
1fab0 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
1fac0 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
1fad0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
1fae0 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
1faf0 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
1fb00 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
1fb10 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
1fb20 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
1fb30 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
1fb40 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
1fb50 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
1fb60 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
1fb70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1fb80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fb90 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fba0 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
1fbb0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1fbc0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1fbd0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1fbe0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1fbf0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1fc00 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1fc10 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1fc20 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1fc30 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1fc40 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1fc50 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1fc60 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1fc70 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1fc80 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1fc90 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1fca0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1fcb0 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1fcc0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1fcd0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fce0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1fcf0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fd00 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1fd10 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1fd20 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1fd30 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1fd40 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1fd50 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1fd60 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1fd70 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1fd80 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1fd90 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1fda0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1fdb0 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
1fdc0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
1fdd0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1fde0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1fdf0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1fe00 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1fe10 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1fe20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1fe30 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1fe40 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1fe50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fe60 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1fe70 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1fe80 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1fe90 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
1fea0 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
1feb0 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
1fec0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1fed0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
1fee0 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
1fef0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1ff00 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
1ff10 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1ff20 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1ff30 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
1ff40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1ff50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1ff60 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
1ff70 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1ff80 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1ff90 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1ffa0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1ffb0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1ffc0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
1ffd0 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
1ffe0 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
1fff0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
20000 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
20010 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
20020 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
20030 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
20040 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
20050 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
20060 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20070 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
20080 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20090 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
200a0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
200b0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
200c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
200d0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
200e0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
200f0 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
20100 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
20110 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
20120 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
20130 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
20140 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
20150 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
20160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
20170 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
20180 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
20190 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
201a0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
201b0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
201c0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
201d0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
201e0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
201f0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20200 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20210 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20220 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
20230 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
20240 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
20250 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
20260 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
20270 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
20280 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
20290 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
202a0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
202b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
202c0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
202d0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
202e0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
202f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
20300 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
20310 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20320 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20330 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
20340 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
20350 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
20360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20370 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20380 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
20390 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
203a0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
203b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
203c0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
203d0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
203e0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
203f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20400 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20420 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
20430 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20440 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
20450 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
20460 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
20470 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20480 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20490 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
204a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
204b0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
204c0 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
204d0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
204e0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
204f0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
20500 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
20510 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20520 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
20530 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20540 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
20550 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
20560 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
20570 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
20580 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
20590 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
205a0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
205b0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
205c0 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
205d0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
205e0 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
205f0 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
20600 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20610 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
20620 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
20630 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
20640 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
20650 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
20660 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
20670 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
20680 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
20690 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
206a0 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
206b0 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
206c0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
206d0 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
206e0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
206f0 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
20700 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
20710 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
20720 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
20730 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
20740 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
20750 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
20760 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
20770 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
20780 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
20790 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
207a0 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
207b0 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
207c0 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
207d0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
207e0 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
207f0 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
20800 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
20810 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
20820 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
20830 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
20840 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
20850 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
20860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
20870 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
20880 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
20890 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
208a0 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
208b0 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
208c0 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
208d0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
208e0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
208f0 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
20900 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
20910 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
20920 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
20930 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
20940 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
20950 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
20960 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
20970 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
20980 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
20990 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
209a0 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
209b0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
209c0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
209d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
209e0 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
209f0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
20a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
20a10 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
20a20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20a30 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20a40 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
20a50 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20a60 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
20a70 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20a80 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
20a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20aa0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
20ab0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
20ac0 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
20ad0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
20ae0 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
20af0 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
20b00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20b10 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
20b20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20b30 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20b40 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
20b50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
20b60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20b70 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
20b80 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
20b90 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
20ba0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
20bb0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
20bc0 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
20bd0 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
20be0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
20bf0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
20c00 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
20c10 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20c20 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
20c30 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
20c40 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
20c50 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
20c60 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
20c70 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
20c80 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
20c90 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
20ca0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
20cb0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
20cc0 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
20cd0 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
20ce0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
20cf0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
20d00 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
20d10 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
20d20 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
20d30 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
20d40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
20d50 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
20d60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20d70 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
20d80 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
20d90 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
20da0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
20db0 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
20dc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20dd0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
20de0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
20df0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
20e00 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
20e10 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
20e20 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
20e30 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
20e40 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
20e50 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
20e60 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
20e70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
20e80 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
20e90 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
20ea0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20eb0 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
20ec0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
20ed0 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
20ee0 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
20ef0 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
20f00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20f10 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
20f20 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
20f30 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
20f40 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
20f50 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
20f60 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
20f70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
20f80 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
20f90 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
20fa0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
20fb0 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
20fc0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
20fd0 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
20fe0 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
20ff0 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
21000 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
21010 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21020 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
21030 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21040 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21050 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21060 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21070 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
21080 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
210a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
210b0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
210c0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
210d0 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
210e0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
210f0 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
21100 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21110 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
21120 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
21130 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
21140 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
21150 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
21160 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
21170 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
21180 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
21190 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
211a0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
211b0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
211c0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
211d0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
211e0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
211f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
21200 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
21210 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
21220 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
21230 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
21240 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
21250 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21260 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
21270 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21280 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
21290 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
212a0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
212b0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
212c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
212d0 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
212e0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
212f0 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
21300 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21310 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
21320 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
21330 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
21340 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
21350 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
21360 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
21370 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
21380 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
21390 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
213a0 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
213b0 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
213c0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
213d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
213e0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
213f0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
21400 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
21410 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
21420 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
21430 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
21440 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
21450 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
21460 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
21470 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
21480 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
21490 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
214a0 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
214b0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
214c0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
214d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
214e0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
214f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21500 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
21510 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
21520 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
21530 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
21540 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
21550 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
21560 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21570 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
21580 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
21590 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
215a0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
215b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
215c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
215d0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
215e0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
215f0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
21600 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
21610 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
21620 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
21630 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
21640 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
21650 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
21660 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
21670 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
21680 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
21690 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
216a0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
216b0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
216c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
216d0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
216e0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
216f0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
21700 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
21710 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
21720 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
21730 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
21740 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
21750 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
21760 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
21770 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
21780 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
21790 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
217a0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
217b0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
217c0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
217d0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
217e0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
217f0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
21800 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
21810 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
21820 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
21830 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
21840 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21850 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21860 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
21870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
21880 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
21890 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
218a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
218b0 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
218c0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
218d0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
218e0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21900 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
21910 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
21920 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
21930 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
21940 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
21950 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
21960 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
21970 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
21980 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
21990 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
219a0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
219b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
219c0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
219d0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
219e0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
219f0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
21a00 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
21a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21a20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
21a30 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
21a40 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
21a50 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
21a60 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
21a70 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
21a80 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
21a90 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
21aa0 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
21ab0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
21ac0 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
21ad0 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
21ae0 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
21af0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
21b00 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
21b10 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
21b20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
21b30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21b40 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
21b50 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
21b60 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
21b70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
21b80 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
21b90 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
21ba0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
21bb0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
21bc0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
21bd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21be0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
21bf0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
21c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21c10 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21c40 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
21c50 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
21c60 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
21c70 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
21c80 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
21c90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21ca0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
21cb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
21cc0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
21cd0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
21ce0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
21cf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21d00 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
21d10 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
21d20 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
21d30 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
21d40 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
21d50 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
21d60 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
21d70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
21d80 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
21d90 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
21da0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
21db0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
21dc0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
21dd0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
21de0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
21df0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
21e00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
21e10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21e20 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
21e30 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
21e40 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
21e50 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
21e60 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
21e70 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
21e80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
21e90 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
21ea0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
21eb0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
21ec0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
21ed0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
21ee0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
21ef0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
21f00 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
21f10 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
21f20 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
21f30 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
21f40 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
21f50 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
21f60 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
21f70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
21f80 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
21f90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
21fa0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
21fb0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
21fc0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
21fd0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
21fe0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
21ff0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22000 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22010 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22020 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
22030 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
22040 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
22050 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
22060 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
22070 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
22080 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22090 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
220a0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
220b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
220c0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
220d0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
220e0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
220f0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22100 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22110 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22120 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
22130 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
22140 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
22150 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
22160 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
22170 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
22180 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22190 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
221a0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
221b0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
221c0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
221d0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
221e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
221f0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
22200 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
22210 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22220 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
22230 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
22240 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
22250 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
22260 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
22270 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
22280 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22290 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
222a0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
222b0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
222c0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
222d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
222e0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
222f0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
22300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22310 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22320 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
22330 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
22340 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
22350 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
22360 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22370 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
22380 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
22390 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
223a0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
223b0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
223c0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
223d0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
223e0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
223f0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
22400 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
22410 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
22420 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
22430 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
22440 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
22450 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
22460 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
22470 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
22480 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
22490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
224a0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
224b0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
224c0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
224d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
224e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
224f0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
22500 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
22510 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
22520 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
22530 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
22540 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
22550 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
22560 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
22570 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
22580 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22590 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
225a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
225b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
225c0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
225d0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
225e0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
225f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
22600 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
22610 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
22620 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
22630 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
22640 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
22650 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22660 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
22670 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
22680 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
22690 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
226a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
226b0 41 42 4c 45 20 2a 2f 0a                          ABLE */.