/ Hex Artifact Content
Login

Artifact 1236e154f9e1ad37d3d5640f57f147002f3ec00e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e    return p ? p->
0740: 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zSql : 0;.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
08e0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08f0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0900: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0910: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0920: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0930: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0940: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0950: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0960: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
0970: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
0980: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
0990: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09b0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09c0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09e0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a00: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a10: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a20: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a30: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a50: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a60: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0ac0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0ad0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0ae0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0af0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b00: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b10: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b20: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b40: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b50: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b60: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0b70: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0b80: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0b90: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0ba0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0bb0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bc0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0bd0: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0be0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0bf0: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c00: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c10: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c20: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c30: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c40: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c50: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c60: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0c70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c80: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0c90: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0ca0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0cb0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cc0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0cd0: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0ce0: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d10: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d20: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d40: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d50: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d60: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0d70: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d80: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0d90: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0da0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0db0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0dc0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0dd0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0de0: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0df0: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e00: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e20: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e30: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e50: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0e70: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0e80: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0e90: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0eb0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0ed0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0ee0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0ef0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f00: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f10: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f20: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f30: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f40: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f50: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f60: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0f70: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0f80: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0f90: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fa0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fb0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0fc0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
0fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0fe0: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
0ff0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1000: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1010: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1020: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1030: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1040: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1050: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1060: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1070: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1080: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1090: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10c0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
10d0: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
10e0: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
10f0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1100: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1110: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1120: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1130: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1150: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1160: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1170: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1180: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1190: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
11a0: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
11b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
11c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
11d0: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
11e0: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
11f0: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b  Alloc<=p->nOp );
1200: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72  .  if( growOpArr
1210: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72  ay(p, 1) ) retur
1220: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
1230: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1240: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
1250: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1260: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1270: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1280: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1290: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
12a0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
12b0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
12c0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
12d0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
12e0: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
12f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1300: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1310: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
1320: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
1330: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
1340: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74  oc<=i ){.    ret
1350: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f  urn growOp3(p, o
1360: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1370: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
1380: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
1390: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
13a0: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
13b0: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
13c0: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
13d0: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
13e0: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
13f0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
1400: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
1410: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
1420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
1430: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
1440: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1470: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
1480: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1490: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14a0: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
14b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
14c0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
14d0: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
14e0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14f0: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1500: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1510: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
1520: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
1530: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
1540: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1550: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
1560: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1570: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1580: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1590: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
15a0: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
15b0: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
15c0: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
15d0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
15e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
15f0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1600: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
1610: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
1620: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1630: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1640: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1650: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1660: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1670: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1680: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1690: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
16a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
16b0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
16c0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
16d0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
16e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
16f0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1700: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1710: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1720: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1730: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1750: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1760: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
17a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17b0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17c0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
17d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17e0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
17f0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
1800: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
1810: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1820: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1830: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1840: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1850: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1860: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1870: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1880: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1890: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
18a0: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
18b0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
18c0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
18d0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
18e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
18f0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1900: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
1910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1920: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1930: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1940: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1950: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1960: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1970: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1980: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1990: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
19a0: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
19b0: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
19c0: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
19d0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
19e0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
19f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1a00: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1a10: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1a20: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1a30: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1a40: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1a50: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1a60: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1a70: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1a80: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1a90: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1aa0: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1ab0: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1ac0: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ad0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1ae0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1af0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1b10: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62  dbeMultiLoad(Vdb
1b20: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b40: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  pes, ...){.  va_
1b50: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69  list ap;.  int i
1b60: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61  ;.  char c;.  va
1b70: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65  _start(ap, zType
1b80: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  s);.  for(i=0; (
1b90: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d  c = zTypes[i])!=
1ba0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
1bb0: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20   c=='s' ){.     
1bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1bd0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1be0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1bf0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1c00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20  e3VdbeAddOp2(p, 
1c10: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a  z==0 ? OP_Null :
1c20: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1c30: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 20 20  iDest++);.      
1c40: 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 33 56  if( z ) sqlite3V
1c50: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1c60: 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  ddr, z, 0);.    
1c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c80: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ca0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cb0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cc0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1ce0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1cf0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d00: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d10: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d20: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d40: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d60: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d70: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d80: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d90: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1da0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dc0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1dd0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1df0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e00: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e10: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e30: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e40: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e50: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e60: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e70: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e80: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1e90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1ea0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ec0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ed0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ee0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f00: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f10: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f20: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f30: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f40: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f50: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f60: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f80: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1f90: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fc0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fe0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1ff0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2000: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2010: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2020: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2030: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2040: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2050: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2060: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2070: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2080: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2090: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20c0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20d0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20e0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
20f0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2110: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2120: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2130: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2140: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2150: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2160: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2170: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2180: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2190: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21a0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21b0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21c0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21d0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
21f0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2200: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2210: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2220: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2240: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2250: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2260: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2280: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
2290: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22a0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22b0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
22c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
22d0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
22e0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
22f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2310: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
2320: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
2330: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
2340: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
2350: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
2360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
2370: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2380: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2390: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
23a0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
23d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
23e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
23f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
2420: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2440: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2450: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2460: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2470: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2490: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
24a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
24d0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
24e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
24f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
2500: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
2510: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2520: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
2530: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2540: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
2550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2570: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2580: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2590: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
25a0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
25b0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
25c0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
25d0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
25e0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
25f0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2600: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2610: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2620: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2630: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2640: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2650: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2660: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2670: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2680: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2690: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
26a0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
26b0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
26c0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
26d0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
26e0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
26f0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2700: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2710: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2720: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2730: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2740: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2750: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2760: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2770: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2780: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2790: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
27a0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
27b0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
27c0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
27d0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
27f0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
2800: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2810: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2820: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
2830: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2840: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2850: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
2860: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
2870: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
2880: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2890: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
28a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
28e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
28f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
2900: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
2910: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
2920: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
2930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2940: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2950: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2960: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2970: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2980: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2990: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
29a0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
29b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
29c0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
29d0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
29f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2a00: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2a10: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2a20: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2a30: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2a40: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2a50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2a70: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2a80: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2a90: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2aa0: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2ab0: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
2ac0: 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d  .  p->iFixedOp =
2ad0: 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a   v->nOp - 1;.}..
2ae0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
2af0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2b00: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2b10: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
2b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
2b30: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
2b40: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
2b50: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
2b60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
2b70: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
2b80: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
2b90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
2ba0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
2bb0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
2bc0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2bd0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
2be0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
2bf0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
2c00: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
2c10: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
2c20: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
2c30: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
2c40: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
2c50: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
2c60: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2c70: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
2c80: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
2c90: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
2ca0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2cb0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
2cc0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
2cf0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
2d00: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
2d10: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
2d20: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
2d30: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
2d40: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
2d50: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
2d60: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2d70: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
2d80: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2d90: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
2da0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
2db0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
2dc0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
2dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
2de0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
2df0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
2e00: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
2e10: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2e20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2e30: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2e40: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e60: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2e70: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2e80: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2ea0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2eb0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
2ec0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
2ef0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
2f00: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
2f10: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2f20: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2f30: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2f40: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2f50: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2f60: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2f70: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2f80: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2f90: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2fa0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2fb0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
2fc0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
2fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fe0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
2ff0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
3000: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
3010: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
3020: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
3030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
3040: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
3050: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
3060: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
3070: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
3080: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
3090: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
30a0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
30b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
30c0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
30d0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
30e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
30f0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
3100: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
3110: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
3120: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
3130: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
3140: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
3150: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
3160: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
3170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3180: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
3190: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
31a0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
31b0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
31c0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
31d0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
31e0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
31f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
3200: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
3210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3220: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
3230: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
3240: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
3250: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3260: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3270: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
3280: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
3290: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
32a0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
32b0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
32c0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
32d0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
32e0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
32f0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
3300: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
3310: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
3320: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
3330: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
3340: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
3350: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
3360: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
3370: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
3380: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
3390: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
33a0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
33b0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
33c0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
33d0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
33e0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
33f0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3400: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3410: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
3420: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
3430: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
3440: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
3450: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
3460: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
3470: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
3480: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
3490: 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f  ateTable and OP_
34a0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66  InitCoroutine (f
34b0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
34c0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
34d0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
34e0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
34f0: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3500: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3510: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3520: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3530: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3540: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3550: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3560: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3580: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3590: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
35a0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
35b0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
35c0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
35d0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
35e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
35f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3600: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3610: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3620: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3630: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3640: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3650: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3660: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3670: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3680: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3690: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
36a0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
36b0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
36c0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
36d0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
36e0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
36f0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3700: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3710: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3720: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3730: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3740: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3750: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3770: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3780: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3790: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
37a0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
37b0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
37c0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
37d0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
37e0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
37f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3800: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3810: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3820: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3830: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3840: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3850: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
3860: 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74 65  able ) hasCreate
3870: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
3880: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
3890: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
38a0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38b0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
38c0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
38d0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
38e0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
38f0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
3900: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
3910: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
3920: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
3930: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
3940: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
3950: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
3960: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
3970: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
3980: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
3990: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
39a0: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
39b0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
39c0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
39d0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
39e0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
39f0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
3a00: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
3a10: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
3a20: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
3a30: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
3a40: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
3a50: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
3a60: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
3a70: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
3a80: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
3a90: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
3aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3ab0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
3ac0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
3ad0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
3ae0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
3af0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
3b00: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
3b10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3b20: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
3b30: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
3b40: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
3b50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
3b60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3b70: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
3b80: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
3b90: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
3ba0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
3bb0: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
3bc0: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
3bd0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
3be0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
3bf0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
3c00: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
3c10: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
3c20: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
3c30: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
3c40: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
3c50: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
3c60: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
3c70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3c80: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
3c90: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
3ca0: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
3cb0: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
3cc0: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
3cd0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
3ce0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
3cf0: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
3d00: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
3d10: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
3d20: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
3d30: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
3d40: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
3d50: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
3d60: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
3d70: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
3d80: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
3d90: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
3da0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
3db0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
3dc0: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f  oring labels..*/
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3de0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3df0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3e00: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3e10: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3e20: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3e30: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3e50: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3e60: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
3e70: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
3e80: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
3e90: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
3ea0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
3eb0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
3ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3ed0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3ee0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3ef0: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3f00: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3f10: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3f20: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3f30: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3f40: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3f50: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3f60: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
3f70: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
3f80: 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  saction: {.     
3f90: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
3fa0: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
3fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
3fc0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
3fd0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3fe0: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
3ff0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76       case OP_Sav
4000: 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20  epoint: {.      
4010: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4020: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
4030: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
4040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
4050: 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  AL.      case OP
4060: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
4070: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
4080: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
4090: 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
40a0: 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ode: {.        p
40b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
40c0: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
40d0: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
40e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4110: 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  E.      case OP_
4120: 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  VUpdate: {.     
4130: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4140: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4150: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
4160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4170: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4180: 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20  OP_VFilter: {.  
4190: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
41a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
41b0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
41c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
41d0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
41e0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
41f0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
4200: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ].p1;.        if
4210: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
4220: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20  MaxArgs = n;.   
4230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4240: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
4250: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20   case OP_Next:. 
4260: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4270: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63  tIfOpen:.      c
4280: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
4290: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t: {.        pOp
42a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
42b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
42c0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
42d0: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
42e0: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
42f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4300: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20   case OP_Prev:. 
4310: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
4320: 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  vIfOpen: {.     
4330: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4340: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4350: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4360: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4370: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
4380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4390: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
43a0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73  pOp->opflags = s
43b0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
43c0: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20  erty[opcode];.  
43d0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
43e0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
43f0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
4400: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4410: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50  t( -1-pOp->p2<pP
4420: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  arse->nLabel );.
4430: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4440: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
4450: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
4460: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4470: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
4480: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
4490: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
44a0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
44b0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
44c0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
44d0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
44e0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
44f0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
4500: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
4510: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
4520: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4530: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4540: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
4550: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4560: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
4570: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4580: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4590: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
45a0: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
45b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
45c0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
45d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
45e0: 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61  ray of opcodes a
45f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
4600: 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  * the Vdbe passe
4610: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4620: 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74  rgument. It is t
4630: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
4640: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
4650: 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
4660: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74  returned array t
4670: 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  o be eventually 
4680: 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20  freed using the 
4690: 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72  .** vdbeFreeOpAr
46a0: 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ray() function..
46b0: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
46c0: 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73  urning, *pnOp is
46d0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
46e0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
46f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
4700: 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70   array. Also, *p
4710: 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74  nMaxArg is set t
4720: 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  o the larger of 
4730: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
4740: 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75  e and .** the nu
4750: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4760: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  in the Vdbe.apAr
4770: 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72  g[] array requir
4780: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
4790: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70  e .** returned p
47a0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f  rogram..*/.VdbeO
47b0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
47c0: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
47d0: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
47e0: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
47f0: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
4800: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
4810: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
4820: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
4830: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
4840: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4850: 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63  tree() was not c
4860: 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d  alled on this VM
4870: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62   */.  assert( Db
4880: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4890: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20  treeMask) );..  
48a0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
48b0: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
48c0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
48d0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
48e0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
48f0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
4900: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
4910: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
4920: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
4930: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
4940: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
4950: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
4960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4970: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
4980: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
4990: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
49a0: 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e  *aOp, int iLinen
49b0: 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  o){.  int addr, 
49c0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
49d0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
49e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
49f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4a00: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4a10: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4a20: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4a30: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4a40: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4a50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4a60: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4a70: 70 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  p;.  pOut = &p->
4a80: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72  aOp[addr];.  for
4a90: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
4aa0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
4ab0: 7b 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 61  {.    int p2 = a
4ac0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 70 4f 75 74  Op->p2;.    pOut
4ad0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e  ->opcode = aOp->
4ae0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74  opcode;.    pOut
4af0: 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a  ->p1 = aOp->p1;.
4b00: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a      if( p2<0 ){.
4b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4b20: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4b30: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4b40: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4b50: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
4b60: 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   = addr + ADDR(p
4b70: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
4b80: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4b90: 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  p2;.    }.    pO
4ba0: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
4bb0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
4bc0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4bd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
4be0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
4bf0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4c00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4c10: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4c20: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
4c30: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
4c40: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
4c50: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
4c60: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
4c70: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
4c80: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4c90: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4cb0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
4cc0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
4cd0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
4ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4cf0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4d00: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4d10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4d20: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4d30: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  Op;.  return add
4d40: 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  r;.}..#if define
4d50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4d60: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
4d70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
4d80: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
4d90: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
4da0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
4db0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
4dc0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
4dd0: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
4de0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
4e10: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
4e20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
4e30: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
4e40: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4e50: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
4e60: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
4e70: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
4e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4e90: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
4ea0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
4eb0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4ed0: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
4ee0: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
4ef0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
4f20: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
4f30: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
4f40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4f60: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
4f70: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
4f80: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
4f90: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
4fa0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
4fb0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
4fc0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
4fd0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
4fe0: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
4ff0: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
5000: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
5010: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
5020: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
5030: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
5040: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
5050: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
5060: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
5070: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
5080: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
5090: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
50a0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
50b0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
50c0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
50d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
50e0: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
50f0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
5100: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
5110: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
5120: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5130: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
5140: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
5150: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
5160: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5170: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5180: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5190: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
51a0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38  *p, u32 addr, u8
51b0: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
51c0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
51d0: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
51e0: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
51f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5200: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
5210: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5220: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5230: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5240: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
5250: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5260: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
5270: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5280: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5290: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
52a0: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
52b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52c0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
52d0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
52e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
52f0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5300: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
5310: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5320: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
5330: 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  p5){.  sqlite3Vd
5340: 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e 70  beGetOp(p,-1)->p
5350: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
5360: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
5370: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
5380: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
5390: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
53a0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
53b0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
53c0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
53d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
53e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
53f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5400: 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  r){.  p->pParse-
5410: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
5420: 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  Op - 1;.  sqlite
5430: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5440: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5450: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5460: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5470: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5480: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5490: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
54a0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
54b0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
54c0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
54d0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
54e0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
54f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5500: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5510: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
5520: 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  & (pDef->funcFla
5530: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5540: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5560: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
5570: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
5580: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5590: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
55a0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
55b0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
55c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
55d0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
55e0: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
55f0: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
5600: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
5610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
5620: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
5630: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
5640: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
5650: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5660: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5670: 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f 63  (db, ((sqlite3_c
5680: 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 75  ontext*)p4)->pFu
5690: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nc);.        /* 
56a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
56b0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
56c0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
56d0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
56e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
56f0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
5700: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
5710: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
5720: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
5730: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5740: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5750: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5760: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
5770: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5780: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5790: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
57a0: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
57b0: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
57c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
57e0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
57f0: 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  S.      case P4_
5800: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EXPR: {.        
5810: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5820: 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29  e(db, (Expr*)p4)
5830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5840: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
5850: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
5860: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
5870: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
5880: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
5890: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
58a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
58c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
58d0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
58e0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
58f0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
5900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5920: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
5930: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5940: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
5950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
5960: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
5970: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
5980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5990: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
59a0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
59b0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
59c0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
59d0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
59e0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  c);.          sq
59f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a00: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
5a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5a30: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
5a40: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5a50: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5a60: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
5a70: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
5a80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
5ab0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
5ac0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
5ad0: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
5ae0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
5af0: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
5b00: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
5b10: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
5b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
5b30: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
5b40: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
5b50: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5b60: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5b70: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
5b80: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
5b90: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
5ba0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
5bb0: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
5bc0: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
5bd0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5be0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5bf0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
5c00: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5c10: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
5c20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5c30: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
5c40: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
5c50: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5c60: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
5c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
5c80: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
5c90: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
5ca0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5cb0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
5cc0: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
5cd0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
5ce0: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
5cf0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
5d00: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
5d10: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
5d20: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
5d30: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
5d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
5d50: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
5d60: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
5d70: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
5d80: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
5d90: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
5da0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
5db0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5dc0: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
5dd0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
5de0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5df0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
5e00: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5e10: 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d  ){.  if( addr<p-
5e20: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >nOp ){.    Vdbe
5e30: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5e40: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
5e50: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5e60: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
5e70: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5e80: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
5e90: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
5ea0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
5eb0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
5ec0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a  OP_Noop;.  }.}..
5ed0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
5ee0: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
5ef0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
5f00: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
5f10: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
5f20: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
5f30: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
5f40: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
5f50: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
5f60: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5f70: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
5f80: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
5f90: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
5fa0: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
5fb0: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
5fc0: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
5fd0: 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =op ){.    sqlit
5fe0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
5ff0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
6000: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
6010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6020: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
6030: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
6040: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
6050: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
6060: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
6070: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
6080: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
6090: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
60a0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
60b0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
60c0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
60d0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
60e0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
60f0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
6100: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
6110: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
6120: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
6130: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
6140: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
6150: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
6160: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
6170: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
6180: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
6190: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
61a0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
61b0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
61c0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
61d0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
61e0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
61f0: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
6200: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
6210: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
6220: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
6230: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
6240: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
6250: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
6260: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
6270: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
6280: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
6290: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
62a0: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
62b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
62c0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
62d0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
62e0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
62f0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
6300: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
6310: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6320: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
6330: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6340: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6350: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
6360: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
6370: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
6380: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
6390: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
63a0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
63b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
63c0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
63d0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
63e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
63f0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
6400: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
6410: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n!=P4_VTAB ){. 
6420: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
6430: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
6440: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
6450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6470: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6480: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
6490: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
64a0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
64b0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
64c0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
64d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
64e0: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
64f0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  ED.       || pOp
6500: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
6510: 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  32.       || pOp
6520: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
6530: 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34  INFO );.  freeP4
6540: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
6550: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
6560: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
6570: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
6580: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
6590: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
65a0: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
65b0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
65c0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
65d0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
65e0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
65f0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
6600: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
6610: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
6620: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6630: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
6640: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
6650: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
6660: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
6670: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6680: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
6690: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
66a0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
66b0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
66c0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
66d0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66 64  P4_KEYINFO;.#ifd
66e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
66f0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
6700: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6710: 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20 52  EXPR ){.    /* R
6720: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f  esponsibility fo
6730: 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 45  r deleting the E
6740: 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e 64  xpr tree is hand
6750: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 20  ed over to the. 
6760: 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74 68     ** VDBE by th
6770: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54  is operation.  T
6780: 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
6790: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69 6e   have already in
67a0: 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71 6c  voked.    ** sql
67b0: 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f 72  ite3ExprDup() or
67c0: 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72 20   whatever other 
67d0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64 65  routine is neede
67e0: 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20 20  d to make a .   
67f0: 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70 79   ** private copy
6800: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f   of the tree. */
6810: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45 78  .    pOp->p4.pEx
6820: 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34 3b  pr = (Expr*)zP4;
6830: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6840: 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e 64   = P4_EXPR;.#end
6850: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  if.  }else if( n
6860: 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20  ==P4_VTAB ){.   
6870: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
6880: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
6890: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54  ->p4type = P4_VT
68a0: 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AB;.    sqlite3V
68b0: 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20  tabLock((VTable 
68c0: 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65  *)zP4);.    asse
68d0: 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a  rt( ((VTable *)z
68e0: 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29  P4)->db==p->db )
68f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
6900: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
6910: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
6920: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6930: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
6940: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
6950: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
6960: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6970: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6980: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
6990: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
69a0: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
69b0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
69c0: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  IC;.  }.}../*.**
69d0: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74   Set the P4 on t
69e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
69f0: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f   added opcode to
6a00: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72   the KeyInfo for
6a10: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69   the.** index gi
6a20: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
6a30: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6a40: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
6a50: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
6a60: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6a70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
6a80: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
6a90: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
6aa0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6ab0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6ac0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
6ad0: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
6ae0: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20  arse, pIdx),.   
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
6b10: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
6b20: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6b30: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
6b40: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
6b50: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
6b60: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
6b70: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
6b80: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
6b90: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
6ba0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
6bb0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
6bc0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
6bd0: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
6be0: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
6bf0: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
6c00: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
6c10: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
6c20: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
6c30: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
6c40: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
6c50: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6c60: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
6c70: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
6c80: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
6c90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6ca0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
6cb0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
6cc0: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
6cd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6ce0: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
6cf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6d00: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
6d10: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
6d20: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d30: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
6d40: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d50: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
6d60: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
6d70: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6d80: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
6d90: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
6da0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
6db0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
6dc0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
6de0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6df0: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6e00: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6e10: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6e20: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
6e30: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
6e40: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
6e60: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6e70: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6e80: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6e90: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
6ea0: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
6eb0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6ec0: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
6ed0: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
6ee0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
6ef0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
6f00: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
6f10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
6f20: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
6f30: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
6f40: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
6f50: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
6f60: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
6f70: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6f80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6f90: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
6fa0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
6fb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6fc0: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
6fd0: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
6fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6ff0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
7000: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
7010: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
7020: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
7030: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
7040: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
7050: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
7060: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
7070: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
7080: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
7090: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
70a0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
70b0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
70c0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
70d0: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
70e0: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
70f0: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
7100: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
7110: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
7120: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
7130: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
7140: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
7150: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
7160: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
7170: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
7180: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
7190: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
71a0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f  ng.** after an O
71b0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
71c0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
71d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
71e0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
71f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7200: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
7210: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
7220: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
7230: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
7240: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
7250: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
7260: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
7270: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
7280: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
7290: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
72a0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
72b0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
72c0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
72d0: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
72e0: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
72f0: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
7300: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
7310: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
7320: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
7330: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
7340: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
7350: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
7360: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
7370: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
7380: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
7390: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
73a0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
73b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
73c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
73d0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
73e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
73f0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
7400: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
7410: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
7420: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7430: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7440: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7450: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
7460: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
7470: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7480: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
7490: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
74a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
74b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
74c0: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
74d0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
74e0: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
74f0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
7500: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
7510: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
7520: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
7530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
7540: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
7550: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
7560: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
7570: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
7580: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
7590: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
75a0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
75b0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
75c0: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
75d0: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
75e0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
75f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
7600: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
7610: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
7620: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
7630: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
7640: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
7650: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
7660: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
7670: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
7680: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
7690: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
76a0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
76b0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
76c0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
76d0: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
76e0: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
76f0: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
7700: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
7710: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
7720: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
7730: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
7740: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
7750: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
7760: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
7770: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
7780: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
7790: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
77a0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
77b0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
77c0: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
77d0: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
77e0: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
77f0: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
7800: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7810: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
7820: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
7830: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
7840: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
7850: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
7860: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
7870: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
7880: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
7890: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
78a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
78b0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
78c0: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
78d0: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
78e0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
78f0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
7900: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
7910: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
7920: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7930: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
7940: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
7950: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
7960: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
7970: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
7980: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
7990: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
79a0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
79b0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
79c0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
79d0: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
79e0: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
79f0: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
7a00: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
7a10: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
7a20: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
7a30: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
7a40: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
7a50: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
7a60: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
7a70: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
7a80: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
7a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7aa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7ab0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7ac0: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
7ad0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7ae0: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
7af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7b00: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7b10: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
7b20: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
7b30: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
7b40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
7b50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
7b60: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
7b70: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
7b80: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
7b90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7ba0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7bb0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
7bc0: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
7bd0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
7be0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
7bf0: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
7c00: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
7c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
7c20: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
7c30: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
7c40: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
7c50: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
7c60: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7c80: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7c90: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
7ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7cb0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
7cc0: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7ce0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
7cf0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d10: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7d20: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
7d30: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
7d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7d60: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7d70: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
7d80: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
7d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7da0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
7db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7dc0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7dd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7de0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
7df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
7e00: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
7e10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7e20: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
7e30: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
7e40: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7e60: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7e70: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
7e80: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7e90: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
7ea0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7eb0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
7ec0: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
7ed0: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
7ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
7ef0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
7f00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f10: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f20: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
7f30: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
7f40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7f50: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
7f60: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
7f70: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
7f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7fa0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
7fb0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
7fc0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
7fd0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7fe0: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
7ff0: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
8000: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
8010: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
8020: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
8030: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
8040: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
8050: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
8060: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
8070: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
8080: 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e 54  layP4Expr(int nT
8090: 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  emp, char *zTemp
80a0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
80b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
80c0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a  p = 0;.  int n;.
80d0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
80e0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
80f0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8100: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8110: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8120: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
8130: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
8140: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8150: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
8160: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8170: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8180: 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
8190: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
81a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
81b0: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69  NULL:.      sqli
81c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
81d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
81e0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
81f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
8200: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
8210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8220: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72  nTemp, zTemp, "r
8230: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
8240: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
8250: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8260: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
8270: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8280: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
8290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
82a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
82b0: 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  emp, "rowid");. 
82c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
82d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
82f0: 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70  p, "c%d", (int)p
8300: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
8310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8320: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8330: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
8340: 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  zOp = "LT";     
8350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8360: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70   TK_LE:      zOp
8370: 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72   = "LE";      br
8380: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8390: 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GT:      zOp = 
83a0: 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GT";      break
83b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
83c0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45  :      zOp = "GE
83d0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
83e0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
83f0: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20      zOp = "NE"; 
8400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8410: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
8420: 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20   zOp = "EQ";    
8430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8440: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f  e TK_IS:      zO
8450: 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62  p = "IS";      b
8460: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8470: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d  K_ISNOT:   zOp =
8480: 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61   "ISNOT";   brea
8490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
84a0: 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41  ND:     zOp = "A
84b0: 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ND";     break;.
84c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
84d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
84e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84f0: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
8500: 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20    zOp = "ADD";  
8510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8520: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
8530: 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20  Op = "MUL";     
8540: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8550: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20  TK_MINUS:   zOp 
8560: 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65  = "SUB";     bre
8570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8580: 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  REM:     zOp = "
8590: 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  REM";     break;
85a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
85b0: 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  AND:  zOp = "BIT
85c0: 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  AND";  break;.  
85d0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
85e0: 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22     zOp = "BITOR"
85f0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8600: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
8610: 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  zOp = "DIV";    
8620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8630: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70   TK_LSHIFT:  zOp
8640: 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72   = "LSHIFT";  br
8650: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8660: 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _RSHIFT:  zOp = 
8670: 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "RSHIFT";  break
8680: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
8690: 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f  NCAT:  zOp = "CO
86a0: 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NCAT";  break;. 
86b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
86c0: 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53  S:  zOp = "MINUS
86d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
86e0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
86f0: 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20   zOp = "PLUS";  
8700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8710: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f  e TK_BITNOT:  zO
8720: 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62  p = "BITNOT";  b
8730: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8740: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d  K_NOT:     zOp =
8750: 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61   "NOT";     brea
8760: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8770: 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49  SNULL:  zOp = "I
8780: 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  SNULL";  break;.
8790: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
87a0: 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e  ULL: zOp = "NOTN
87b0: 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
87c0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
87d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
87e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
87f0: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
8800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
8810: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
8820: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8830: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8840: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
8850: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
8860: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
8870: 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34    n += displayP4
8880: 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54  Expr(nTemp-n, zT
8890: 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c  emp+n, pExpr->pL
88a0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  eft);.    if( n<
88b0: 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70 72  nTemp-1 && pExpr
88c0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
88d0: 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27    zTemp[n++] = '
88e0: 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 64  ,';.      n += d
88f0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65  isplayP4Expr(nTe
8900: 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70  mp-n, zTemp+n, p
8910: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8920: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8930: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
8940: 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29  n, zTemp+n, ")")
8950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
8960: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8970: 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Temp);.}.#endif 
8980: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
8990: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
89a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
89b0: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
89c0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
89d0: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
89e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
89f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
8a00: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
8a10: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
8a20: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
8a30: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
8a40: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
8a50: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
8a60: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
8a70: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
8a80: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
8a90: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
8aa0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
8ab0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
8ac0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8ad0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
8ae0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
8af0: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
8b00: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
8b10: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8b20: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
8b30: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
8b40: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
8b50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8b60: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8b70: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
8b80: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
8b90: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
8ba0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
8bb0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
8bc0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
8bd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
8be0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8bf0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
8c00: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
8c10: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8c20: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
8c30: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
8c40: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
8c50: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
8c60: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
8c70: 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70  ( n==6 && memcmp
8c80: 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c  (zColl,"BINARY",
8c90: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
8ca0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a     zColl = "B";.
8cb0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
8cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8cd0: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
8ce0: 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -7 ){.          
8cf0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
8d00: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
8d10: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
8d20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8d40: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
8d50: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ';.        if( p
8d60: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8d70: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
8d80: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
8d90: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '-';.        }.
8da0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
8db0: 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c  zTemp[i], zColl,
8dc0: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69   n+1);.        i
8dd0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
8de0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8df0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
8e00: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
8e10: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
8e20: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
8e30: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
8e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8e50: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
8e60: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
8e70: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
8e80: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70  (nTemp, zTemp, p
8e90: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
8ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8eb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
8ec0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
8ed0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8ee0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
8ef0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
8f00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8f10: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32  mp, zTemp, "(%.2
8f20: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
8f30: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
8f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8f50: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
8f60: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8f70: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
8f80: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
8f90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8fa0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
8fb0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
8fc0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
8fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8ff0: 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BUG.    case P4_
9000: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
9010: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
9020: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
9030: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
9040: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9050: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
9060: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
9070: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
9080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9090: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
90a0: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
90b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
90c0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
90d0: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
90e0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
90f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9100: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
9110: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9130: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
9140: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
9150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9160: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
9170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9180: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9190: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
91a0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
91b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
91d0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
91e0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
91f0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
9200: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9210: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
9220: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
9230: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9240: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9250: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
9260: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9270: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
9280: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
9290: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
92a0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
92b0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
92d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
92e0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
92f0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
9300: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9310: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9330: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9340: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
9350: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9360: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9370: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9380: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
9390: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
93a0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
93c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
93d0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
93e0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
93f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9400: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9410: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9420: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9440: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
9450: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
9460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9470: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9480: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
9490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94a0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94b0: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
94c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
94d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
94e0: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
94f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9500: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9510: 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  p, "program");. 
9520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9530: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
9540: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
9550: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9570: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
9580: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
9590: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
95a0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
95b0: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
95c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
95d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
95e0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
95f0: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
9600: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
9610: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
9620: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
9630: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
9640: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
9650: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
9660: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
9670: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
9680: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
9690: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
96a0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
96b0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
96c0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
96d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
96e0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
96f0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
9700: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
9710: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
9720: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
9730: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
9740: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
9750: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
9760: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
9770: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
9780: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9790: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
97a0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
97b0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
97c0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
97d0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
97e0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
97f0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
9800: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
9810: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
9820: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
9830: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
9840: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
9850: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
9860: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
9870: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
9880: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
9890: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
98a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
98b0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
98c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
98d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
98e0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
98f0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9900: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
9910: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
9920: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
9930: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
9940: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9950: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
9960: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
9970: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
9980: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
9990: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
99a0: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
99b0: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
99c0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
99d0: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
99e0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
99f0: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
9a00: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
9a10: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
9a20: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
9a30: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
9a40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
9a50: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
9a60: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
9a70: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9a80: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
9a90: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
9aa0: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
9ab0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
9ac0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
9ad0: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
9ae0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
9af0: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
9b00: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
9b10: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
9b20: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
9b30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
9b40: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
9b50: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
9b60: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
9b70: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
9b80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
9b90: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
9ba0: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
9bb0: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
9bc0: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
9bd0: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
9be0: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
9bf0: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
9c00: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
9c10: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
9c20: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
9c30: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
9c40: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
9c50: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
9c60: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
9c70: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
9c80: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
9c90: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
9ca0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
9cb0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
9cc0: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
9cd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9ce0: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
9cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
9d00: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
9d10: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
9d20: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9d30: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9d40: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9d50: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9d60: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
9d70: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
9d80: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
9d90: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
9da0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
9db0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
9dc0: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
9dd0: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
9de0: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
9df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9e00: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
9e10: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
9e20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
9e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9e40: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9e50: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
9e60: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
9e70: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
9e80: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
9e90: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
9ea0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
9eb0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  eEnter()..*/.sta
9ec0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
9ed0: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61  INE void vdbeLea
9ee0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
9ef0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
9f00: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
9f10: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20    int nDb;.  db 
9f20: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
9f30: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
9f40: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
9f50: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
9f60: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
9f70: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
9f80: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
9f90: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
9fa0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
9fb0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
9fc0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
9fd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
9fe0: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
9ff0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
a000: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a010: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a020: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a030: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64  mon case */.  vd
a040: 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65  beLeave(p);.}.#e
a050: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
a060: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
a070: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
a080: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
a090: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
a0a0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
a0b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
a0c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
a0d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a0e0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
a0f0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
a100: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
a110: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
a120: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
a130: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
a140: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
a150: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
a160: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
a170: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
a180: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
a190: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
a1a0: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
a1b0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
a1c0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
a1d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a1e0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a1f0: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
a200: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
a210: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
a220: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
a230: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
a240: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
a250: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
a260: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
a270: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
a280: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
a290: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
a2a0: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
a2b0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
a2c0: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
a2d0: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
a2e0: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
a2f0: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
a300: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
a310: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
a320: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
a330: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
a340: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
a350: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
a360: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
a370: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
a380: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
a390: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
a3a0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
a3b0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
a3c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a3d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
a3e0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
a3f0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
a400: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
a410: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
a420: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a430: 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69     u8 malloc_fai
a440: 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
a450: 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20  Failed;.    if( 
a460: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
a470: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
a480: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
a490: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
a4a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
a4b0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
a4c0: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
a4d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
a4f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
a500: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
a510: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
a520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a530: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a540: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
a550: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
a560: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
a570: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
a580: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
a590: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
a5a0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
a5b0: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
a5c0: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
a5d0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
a5e0: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
a5f0: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
a600: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
a610: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
a620: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
a630: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
a640: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
a650: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
a660: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
a670: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
a680: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
a690: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
a6a0: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
a6b0: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
a6c0: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
a6d0: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
a6e0: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
a6f0: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
a700: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
a710: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
a720: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
a730: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
a740: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
a750: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
a760: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
a770: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
a780: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
a790: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
a7a0: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
a7b0: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
a7c0: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
a7d0: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
a7e0: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
a7f0: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
a800: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
a810: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
a820: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
a830: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
a850: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a860: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a870: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
a880: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
a890: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
a8a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a8b0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
a8c0: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
a8d0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
a8e0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
a8f0: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
a900: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
a910: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
a920: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
a930: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
a940: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
a950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a960: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
a970: 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c         p->szMall
a980: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
a990: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
a9a0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
a9b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
a9c0: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 64  p)<pEnd );.    d
a9d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a9e0: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
a9f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
aa00: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
aa10: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
aa20: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
aa30: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
aa40: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
aa50: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
aa60: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
aa70: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
aa80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
aa90: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
aaa0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
aab0: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
aac0: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
aad0: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
aae0: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
aaf0: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
ab00: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
ab10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
ab20: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
ab30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
ab40: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
ab50: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
ab60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
ab70: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
ab80: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
ab90: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
aba0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
abb0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
abc0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
abd0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
abe0: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
abf0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
ac00: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
ac10: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ac20: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
ac30: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
ac40: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
ac50: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
ac60: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
ac70: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
ac80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
ac90: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
aca0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
acb0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
acc0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
acd0: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
ace0: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
acf0: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
ad00: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
ad10: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
ad20: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
ad30: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
ad40: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
ad50: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
ad60: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
ad70: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
ad80: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
ad90: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
ada0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
adb0: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
adc0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
add0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
ade0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
adf0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
ae00: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
ae10: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
ae20: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
ae30: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ae50: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
ae60: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
ae90: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
aea0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
aeb0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
aee0: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
aef0: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
af00: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af20: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
af30: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
af40: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af60: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
af70: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
af80: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
af90: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afb0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
afc0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
afd0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
b000: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
b010: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
b020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b030: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
b040: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
b050: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
b060: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
b070: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
b080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
b090: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
b0a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
b0b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
b0c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
b0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b0e0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
b0f0: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
b100: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
b110: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
b120: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
b130: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
b140: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
b150: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
b160: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
b170: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
b180: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
b190: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
b1a0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
b1b0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
b1c0: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
b1d0: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
b1e0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b1f0: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
b200: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
b210: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
b220: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
b230: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
b240: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
b250: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
b260: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b270: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
b280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b290: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
b2a0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
b2b0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
b2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
b2e0: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
b2f0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
b300: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
b310: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
b320: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
b330: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
b340: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
b350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b360: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
b370: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
b380: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b390: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
b3a0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
b3b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
b3c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
b3d0: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
b3e0: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
b3f0: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
b400: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
b410: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
b420: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
b430: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
b440: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
b450: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
b460: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
b470: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
b480: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
b490: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
b4a0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
b4b0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
b4c0: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
b4d0: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
b4e0: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
b4f0: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
b500: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
b510: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
b520: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
b530: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
b540: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
b550: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
b560: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
b570: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
b580: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
b590: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
b5a0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
b5b0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
b5c0: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
b5d0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
b5e0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
b5f0: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
b600: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
b610: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
b620: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
b630: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
b640: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
b650: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
b660: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
b670: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
b680: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
b690: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
b6a0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
b6b0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
b6c0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
b6d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
b6e0: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
b6f0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
b700: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
b710: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
b720: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
b730: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
b740: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
b750: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
b760: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
b770: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
b780: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
b790: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
b7a0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
b7b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
b7c0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b7d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b7e0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
b7f0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b800: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
b810: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
b820: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
b830: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
b840: 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  .    char *zP4;.
b850: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
b860: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
b870: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
b880: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
b890: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
b8a0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
b8b0: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
b8c0: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
b8d0: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
b8e0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
b8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
b900: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
b910: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
b920: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
b930: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
b940: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
b950: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b960: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
b970: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
b980: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
b990: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
b9a0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
b9b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
b9c0: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
b9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
b9e0: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
b9f0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
ba00: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
ba10: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
ba20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ba30: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
ba40: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
ba70: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ba80: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
ba90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
baa0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
bab0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
bac0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
bad0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
bae0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
baf0: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
bb00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
bb10: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
bb20: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
bb30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
bb40: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
bb50: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
bb60: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
bb70: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
bb80: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
bb90: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
bba0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
bbb0: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
bbc0: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
bbd0: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
bbe0: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
bbf0: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
bc00: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
bc10: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
bc20: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
bc30: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
bc40: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
bc50: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
bc60: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
bc70: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
bc80: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
bc90: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
bca0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
bcb0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
bcc0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
bcd0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
bce0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
bcf0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
bd00: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
bd10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
bd20: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
bd30: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
bd40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bd50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
bd60: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
bd70: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
bd80: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
bd90: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
bda0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
bdb0: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
bdc0: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
bdd0: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
bde0: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
bdf0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
be00: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
be10: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
be20: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
be30: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
be40: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
be50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
be60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
be70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
be80: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
be90: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P1 */.    pMem++
bec0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
bed0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
bee0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
bef0: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
bf20: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
bf30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
bf40: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
bf50: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
bf80: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
bf90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
bfa0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
bfb0: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
bfc0: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
bfd0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
bfe0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c000: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
c010: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c020: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c030: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
c040: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
c050: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29   pMem->szMalloc)
c060: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
c070: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
c080: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c090: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
c0a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
c0b0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
c0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c0d0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c0e0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c0f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c100: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c110: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c120: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
c130: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
c140: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
c150: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c160: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
c170: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
c180: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c190: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c1a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c1b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c1c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c1d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c1e0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c1f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c200: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
c210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c220: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
c230: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
c240: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
c250: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c260: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
c270: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
c280: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
c290: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
c2a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c2b0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c2c0: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
c2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c2e0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c2f0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c300: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c310: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c320: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c330: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c340: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c350: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
c360: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
c370: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
c380: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c390: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
c3a0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
c3b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
c3e0: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
c3f0: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
c400: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
c410: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
c420: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
c430: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
c440: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c450: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
c460: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
c470: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
c480: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c490: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
c4a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c4b0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
c4c0: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
c4d0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
c4e0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
c4f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c500: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
c510: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
c520: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
c530: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
c540: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
c550: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
c560: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
c570: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
c580: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
c590: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
c5a0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
c5b0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
c5c0: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
c5d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
c5e0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
c5f0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
c600: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
c610: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
c620: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
c630: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c640: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
c650: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c660: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
c670: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
c680: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
c690: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
c6a0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
c6b0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
c6c0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
c6d0: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
c6e0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
c6f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
c700: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
c710: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
c720: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
c730: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
c740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
c750: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
c760: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
c770: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
c780: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
c790: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
c7a0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
c7b0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
c7c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
c7d0: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c7e0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
c7f0: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
c800: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c810: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c820: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c830: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
c840: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
c850: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
c860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c870: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
c880: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
c890: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
c8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
c8b0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
c8c0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
c8d0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
c8e0: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
c8f0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
c900: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
c910: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
c920: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
c930: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
c940: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
c950: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
c960: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
c970: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
c980: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c990: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
c9a0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
c9b0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
c9c0: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
c9d0: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
c9e0: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
c9f0: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
ca00: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
ca10: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
ca20: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
ca30: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
ca40: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ca50: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
ca60: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
ca70: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
ca80: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
ca90: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
caa0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
cab0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
cac0: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
cad0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
cae0: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
caf0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
cb00: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cb10: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
cb20: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
cb30: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
cb40: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
cb50: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
cb60: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
cb70: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
cb80: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
cb90: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
cba0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
cbb0: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
cbc0: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
cbd0: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
cbe0: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
cbf0: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
cc00: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
cc10: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
cc20: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
cc30: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
cc40: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
cc50: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
cc60: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
cc70: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
cc80: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
cc90: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
cca0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
ccb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ccc0: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
ccd0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
cce0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
ccf0: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
cd00: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
cd10: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
cd20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd30: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
cd40: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
cd50: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
cd60: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
cd70: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
cd80: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
cd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
cda0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
cdb0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
cdc0: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
cdd0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
cde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
cdf0: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
ce00: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
ce10: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
ce20: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
ce30: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ce40: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
ce50: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
ce60: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
ce70: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
ce80: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
ce90: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
cea0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
ceb0: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
cec0: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
ced0: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
cee0: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
cef0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
cf00: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
cf10: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
cf20: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
cf30: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
cf40: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
cf50: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
cf60: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
cf70: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
cf80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
cf90: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
cfa0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
cfb0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
cfc0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
cfd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
cfe0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
cff0: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
d000: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
d010: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
d020: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d030: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
d040: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
d050: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
d060: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
d070: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
d080: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d090: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
d0a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d0b0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
d0c0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
d0d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
d0e0: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
d0f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
d100: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
d110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d120: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
d130: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
d140: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
d150: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
d160: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
d170: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
d180: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
d190: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
d1a0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
d1b0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
d1c0: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
d1d0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
d1e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d1f0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
d200: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
d210: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
d220: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
d230: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
d240: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
d250: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
d260: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
d270: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
d280: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
d290: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d2a0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
d2b0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
d2c0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
d2d0: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
d2e0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
d2f0: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
d300: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
d310: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
d320: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
d330: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
d340: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
d350: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
d360: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
d370: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
d380: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
d390: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
d3a0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
d3b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d3c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
d3d0: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
d3e0: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
d3f0: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
d400: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
d410: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
d420: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d440: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
d450: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
d460: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
d470: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
d480: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
d490: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
d4a0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
d4b0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
d4c0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
d4d0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
d4e0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
d4f0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
d500: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
d510: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
d520: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d530: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
d540: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
d550: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
d560: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
d570: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
d580: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
d590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d5a0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
d5b0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5d0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
d5e0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d600: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d610: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d620: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
d630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d640: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d650: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
d660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d680: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
d690: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d6c0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
d6d0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
d6e0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
d6f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d700: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
d710: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
d720: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d740: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d750: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
d760: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d790: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
d7a0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
d7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d7d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d7e0: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d800: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
d810: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
d820: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d850: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
d860: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
d870: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d890: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
d8a0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
d8b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
d8c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d8d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
d8e0: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
d8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d900: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
d910: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
d920: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
d930: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
d940: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
d950: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d960: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
d970: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
d980: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
d990: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
d9a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
d9b0: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
d9c0: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63  >nMaxArg;.  nOnc
d9d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  e = pParse->nOnc
d9e0: 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d  e;.  if( nOnce==
d9f0: 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f  0 ) nOnce = 1; /
da00: 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73  * Ensure at leas
da10: 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d  t one byte in p-
da20: 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a  >aOnceFlag[] */.
da30: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
da40: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
da50: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
da60: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
da70: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
da80: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
da90: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
daa0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
dab0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
dac0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
dad0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
dae0: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
daf0: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
db00: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
db10: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
db20: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
db30: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
db40: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
db50: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
db60: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
db70: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
db80: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
db90: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
dba0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
dbb0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
dbc0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
dbd0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
dbe0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
dbf0: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
dc00: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
dc10: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
dc20: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
dc30: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
dc40: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
dc50: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
dc60: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
dc70: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
dc80: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
dc90: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
dca0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20  ->nOp];         
dcb0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
dcc0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
dcd0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
dce0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
dcf0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  Parse->nOpAlloc]
dd00: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
dd10: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
dd20: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
dd30: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
dd40: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
dd50: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
dd60: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
dd70: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
dd80: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
dd90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
dda0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
ddb0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
ddc0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
ddd0: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
dde0: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
ddf0: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
de00: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
de10: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
de20: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
de30: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
de40: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
de50: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
de60: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
de70: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f  allocated in two
de80: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
de90: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
dea0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
deb0: 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  e unused space a
dec0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
ded0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
dee0: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
def0: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
df00: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
df10: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
df20: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
df30: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
df40: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
df50: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
df60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
df70: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
df80: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
df90: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
dfa0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
dfb0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
dfc0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
dfd0: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
dfe0: 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63  he leftover spac
dff0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
e000: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
e010: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
e020: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
e030: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
e040: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
e050: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e060: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
e070: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
e080: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
e090: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
e0a0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
e0b0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
e0c0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
e0d0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
e0e0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
e0f0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
e100: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
e110: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
e120: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
e130: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
e140: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
e150: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
e160: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
e170: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
e180: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
e190: 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  ar*), &zCsr, zEn
e1a0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
e1b0: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
e1c0: 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20  Space(p->apCsr, 
e1d0: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
e1e0: 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20  dbeCursor*),.   
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45         &zCsr, zE
e210: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
e220: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
e230: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f  allocSpace(p->aO
e240: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20  nceFlag, nOnce, 
e250: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
e260: 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  yte);.#ifdef SQL
e270: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
e280: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70  SCANSTATUS.    p
e290: 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
e2a0: 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c  Space(p->anExec,
e2b0: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
e2c0: 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  64), &zCsr, zEnd
e2d0: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69  , &nByte);.#endi
e2e0: 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  f.    if( nByte 
e2f0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65  ){.      p->pFre
e300: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
e310: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
e320: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  e);.    }.    zC
e330: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
e340: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
e350: 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65  nByte];.  }while
e360: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
e370: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e380: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
e390: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
e3a0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
e3b0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
e3c0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
e3d0: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
e3e0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
e3f0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e400: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
e410: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
e420: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
e430: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e440: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26   if( p->azVar &&
e450: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30   pParse->nzVar>0
e460: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
e470: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
e480: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
e490: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
e4a0: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
e4b0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
e4c0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
e4d0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
e4e0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
e4f0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
e500: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
e510: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
e520: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
e550: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
e560: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
e570: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
e580: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
e590: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
e5a0: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
e5b0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
e5c0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
e5d0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
e5e0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
e5f0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
e600: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
e610: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
e620: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
e630: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
e640: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
e650: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
e660: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
e670: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
e680: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
e690: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
e6a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e6b0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
e6c0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
e6d0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
e6e0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
e6f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
e700: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30  ert( pCx->pBt==0
e710: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
e720: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
e730: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
e740: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
e750: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
e760: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
e770: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
e780: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
e790: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
e7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e7b0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
e7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
e7d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
e7e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e7f0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
e800: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
e810: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
e820: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
e830: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
e840: 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  s, by.        **
e850: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
e860: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
e870: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e880: 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
e890: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
e8a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e8b0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70  Cursor(pCx->uc.p
e8c0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
e8d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e8e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e8f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e900: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55  ABLE.    case CU
e910: 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20  RTYPE_VTAB: {.  
e920: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
e930: 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d  _cursor *pVCur =
e940: 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a   pCx->uc.pVCur;.
e950: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
e960: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
e970: 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74  ule = pVCur->pVt
e980: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
e990: 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72     assert( pVCur
e9a0: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
e9b0: 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e  );.      pVCur->
e9c0: 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
e9d0: 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
e9e0: 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20  lose(pVCur);.   
e9f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ea00: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
ea10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
ea20: 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72  rsors in the cur
ea30: 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73  rent frame..*/.s
ea40: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
ea50: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56  CursorsInFrame(V
ea60: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
ea70: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
ea80: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
ea90: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
eaa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
eab0: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
eac0: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
ead0: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
eae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
eaf0: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
eb00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
eb10: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
eb20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
eb30: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
eb40: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
eb50: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
eb60: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
eb70: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
eb80: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
eb90: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
eba0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
ebb0: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
ebc0: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
ebd0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
ebe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ebf0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
ec00: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
ec10: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
ec20: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c   pFrame->v;.  cl
ec30: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
ec40: 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e(v);.#ifdef SQL
ec50: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
ec60: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e  SCANSTATUS.  v->
ec70: 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d  anExec = pFrame-
ec80: 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
ec90: 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    v->aOnceFlag =
eca0: 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c   pFrame->aOnceFl
ecb0: 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c  ag;.  v->nOnceFl
ecc0: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e  ag = pFrame->nOn
ecd0: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70  ceFlag;.  v->aOp
ece0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
ecf0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
ed00: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
ed10: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
ed20: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
ed30: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
ed40: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
ed50: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
ed60: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
ed70: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
ed80: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
ed90: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
eda0: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
edb0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
edc0: 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
edd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
ede0: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  ange;.  return p
edf0: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
ee00: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
ee10: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
ee20: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
ee30: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
ee40: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
ee50: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
ee60: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
ee70: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
ee80: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
ee90: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
eea0: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
eeb0: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
eec0: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
eed0: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
eee0: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
eef0: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
ef00: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
ef10: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
ef20: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
ef30: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
ef40: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
ef50: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
ef60: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
ef70: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
ef80: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
ef90: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
efa0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
efb0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
efc0: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
efd0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
efe0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
eff0: 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
f000: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
f010: 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
f020: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
f030: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
f040: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
f050: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
f060: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
f070: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
f080: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
f090: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
f0a0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
f0b0: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
f0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
f0d0: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
f0e0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
f0f0: 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
f100: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
f110: 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20  the VM */.  if( 
f120: 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71  p->pAuxData ) sq
f130: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
f140: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29  uxData(p, -1, 0)
f150: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f160: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
f170: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
f180: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73  the VM after a s
f190: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74  ingle run..*/.st
f1a0: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
f1b0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
f1c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f1d0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
f1e0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
f1f0: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
f200: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
f210: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
f220: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
f230: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
f240: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
f250: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
f260: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
f270: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
f280: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
f290: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
f2a0: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
f2b0: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
f2c0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
f2d0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
f2e0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
f2f0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
f300: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
f310: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
f320: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f330: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
f340: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
f350: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
f360: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
f370: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
f380: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
f390: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
f3a0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
f3b0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
f3c0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
f3d0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
f3e0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
f3f0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
f400: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
f410: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
f420: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
f430: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
f440: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
f450: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
f460: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
f470: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f480: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
f490: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
f4a0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
f4b0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
f4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
f4d0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
f4e0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
f4f0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
f500: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
f510: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f520: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
f530: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
f540: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
f550: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
f560: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
f570: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
f580: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
f590: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
f5a0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
f5b0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
f5c0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
f5d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
f5e0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
f5f0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
f600: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
f610: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
f620: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
f630: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
f640: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f650: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
f660: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
f670: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
f680: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
f690: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
f6a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
f6b0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
f6c0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
f6d0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
f6e0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
f6f0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
f700: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
f710: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
f720: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
f730: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
f740: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
f750: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
f760: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
f770: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
f780: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
f790: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
f7a0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
f7b0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
f7c0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
f7d0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
f7e0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
f7f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f800: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
f810: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
f840: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
f850: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f870: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
f880: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
f890: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
f8c0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
f8d0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
f8e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f8f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f900: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
f910: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
f920: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
f930: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f950: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
f960: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
f970: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
f980: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
f990: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
f9a0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
f9b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
f9c0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
f9d0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
f9e0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
f9f0: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
fa00: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
fa10: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
fa20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fa30: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
fa40: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
fa50: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
fa60: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
fa70: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
fa80: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
fa90: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
faa0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
fab0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
fac0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
fad0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
fae0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
faf0: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
fb00: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
fb10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fb20: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
fb30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
fb40: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
fb50: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
fb60: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
fb70: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
fb80: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
fb90: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
fba0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
fbb0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
fbc0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
fbd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
fbe0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
fbf0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
fc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fc10: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
fc20: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
fc30: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
fc40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
fc50: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
fc60: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
fc70: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
fc80: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
fc90: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
fca0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fcb0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
fcc0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
fcd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
fce0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
fcf0: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
fd00: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
fd10: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
fd20: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
fd30: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
fd40: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
fd50: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
fd60: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
fd70: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
fd80: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
fd90: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
fda0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
fdb0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
fdc0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
fdd0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
fde0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
fdf0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
fe00: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
fe10: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
fe20: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
fe30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
fe40: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
fe50: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
fe60: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
fe70: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
fe80: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
fe90: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
fea0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
feb0: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
fec0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
fed0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
fee0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
fef0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
ff00: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
ff10: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
ff20: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
ff30: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
ff40: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
ff50: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
ff60: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
ff70: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
ff80: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
ff90: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
ffa0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
ffb0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
ffc0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
ffd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
ffe0: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
fff0: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
10000 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10010 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10020 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10030 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10040 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10050 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10060 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10070 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10080 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
10090 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
100a0 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
100b0 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s++;.      rc = 
100c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 78 63 6c  sqlite3BtreeExcl
100d0 75 73 69 76 65 4c 6f 63 6b 28 70 42 74 29 3b 0a  usiveLock(pBt);.
100e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
100f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10100 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20  ONCURRENT.  if( 
10110 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
10120 26 26 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d  && (rc & 0xFF)==
10130 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
10140 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f     /* An SQLITE_
10150 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 42  BUSY or SQLITE_B
10160 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 77 61 73  USY_SNAPSHOT was
10170 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
10180 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d  le .    ** attem
10190 70 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68  pting to take th
101a0 65 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e  e WRITER lock on
101b0 20 61 20 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c   a wal file. Rel
101c0 65 61 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ease the.    ** 
101d0 57 52 49 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20  WRITER locks on 
101e0 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73 20 61 6e  all wal files an
101f0 64 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  d return early. 
10200 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
10210 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10220 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
10230 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10240 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
10250 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
10260 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
10270 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10280 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
10290 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
102a0 72 44 72 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f  rDropExclusiveLo
102b0 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
102c0 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
102d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
102e0 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
102f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
10300 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 21 3d  ndif..  if( rc!=
10310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10320 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10330 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
10340 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
10350 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
10360 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
10370 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
10380 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
10390 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
103a0 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
103b0 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
103c0 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
103d0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
103e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
103f0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10400 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20  NT_COMMITHOOK;. 
10410 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
10420 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
10430 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
10440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10450 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
10460 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
10470 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
10480 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
10490 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
104a0 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
104b0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
104c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
104d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
104e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
104f0 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
10500 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
10510 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
10520 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
10530 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
10540 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
10550 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
10560 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
10570 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
10580 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
10590 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
105a0 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
105b0 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
105c0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
105d0 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
105e0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
105f0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
10600 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
10610 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10630 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10640 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
10650 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10660 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
10670 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
10680 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
10690 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
106a0 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
106b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
106c0 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
106d0 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
106e0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
106f0 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
10700 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
10710 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
10720 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
10730 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
10740 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
10750 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
10760 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
10770 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
10780 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
10790 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
107a0 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
107b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
107c0 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
107d0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
107e0 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
107f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
10800 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10810 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
10820 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10830 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10840 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
10850 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10860 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
10870 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
10880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
108a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
108b0 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
108c0 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
108d0 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
108e0 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
108f0 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
10900 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10910 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
10920 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
10930 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10940 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
10950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
10960 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
10970 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  tomically..  */.
10980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10990 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
109a0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
109b0 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
109c0 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
109d0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
109e0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
109f0 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
10a00 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
10a10 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
10a20 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
10a30 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
10a40 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
10a50 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
10a60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
10a70 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
10a80 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
10a90 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
10aa0 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
10ab0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
10ac0 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
10ad0 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
10ae0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10af0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
10b00 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
10b10 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
10b20 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
10b30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10b40 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
10b50 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
10b60 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
10b70 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
10b80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10b90 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
10ba0 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
10bb0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
10bc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
10bd0 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
10be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10bf0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
10c00 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
10c10 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
10c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
10c30 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
10c40 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
10c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
10c70 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
10c80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10c90 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
10ca0 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
10cb0 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
10cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10cd0 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
10ce0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
10cf0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
10d00 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
10d10 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
10d20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10d30 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
10d40 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
10d50 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
10d80 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
10d90 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
10da0 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
10db0 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
10dc0 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
10dd0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10de0 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
10df0 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
10e00 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
10e10 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
10e20 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
10e30 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
10e40 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
10e50 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
10e60 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
10e70 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
10e80 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
10e90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
10ea0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
10eb0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
10ec0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
10ed0 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
10ee0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10ef0 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
10f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
10f20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
10f30 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
10f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10f50 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
10f60 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
10f70 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
10f80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
10f90 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
10fa0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
10fb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
10fc0 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
10fd0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
10fe0 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
10ff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
11000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11010 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11020 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11040 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
11050 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
11060 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
11070 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
11080 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
11090 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
110a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
110b0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
110c0 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
110d0 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
110e0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
110f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11100 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
11110 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
11120 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
11130 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
11140 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11150 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
11160 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
11170 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
11180 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
11190 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
111a0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
111b0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
111c0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
111d0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
111e0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
111f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
11200 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
11210 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
11220 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
11230 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
11240 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
11250 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
11260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
11270 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
11280 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
11290 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
112a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
112b0 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
112c0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
112d0 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
112e0 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
112f0 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
11300 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
11310 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
11320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
11330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11340 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
11350 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11360 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
11370 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
11380 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
11390 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
113a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
113b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
113c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
113d0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
113e0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
113f0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11400 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11420 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11430 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
11440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
11470 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
11480 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
11490 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
114a0 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
114b0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
114c0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
114d0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
114e0 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
114f0 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
11500 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11510 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
11520 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
11530 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
11540 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
11550 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
11560 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
11570 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
11580 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
11590 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
115a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
115b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
115c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
115d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
115e0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
115f0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11600 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11610 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
11620 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
11630 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
11640 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
11650 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
11660 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11670 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
11680 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
11690 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
116a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
116b0 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
116c0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
116d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
116e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
116f0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
11700 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
11710 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
11720 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11730 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
11740 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
11750 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
11760 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
11770 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
11780 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
11790 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
117a0 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
117b0 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
117c0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
117d0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
117e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
117f0 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
11800 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
11810 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
11820 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
11830 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
11840 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
11850 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11860 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11870 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
11880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11890 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
118a0 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
118b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
118c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
118d0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
118e0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
118f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
11900 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
11910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11920 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11930 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11960 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
11970 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11980 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
11990 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
119a0 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
119b0 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
119c0 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
119d0 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
119e0 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
119f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
11a00 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
11a10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
11a20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11a30 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  pVfs, zMaster, n
11a40 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71  eedSync);.    sq
11a50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11a60 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
11a70 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
11a80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
11a90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11aa0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
11ab0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
11ac0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
11ad0 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
11ae0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
11af0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
11b00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
11b10 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
11b20 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
11b30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
11b40 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
11b50 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
11b60 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
11b70 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
11b80 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
11b90 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
11ba0 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
11bb0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
11bc0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
11bd0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
11be0 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
11bf0 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
11c00 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
11c10 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
11c20 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
11c30 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
11c40 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
11c50 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
11c60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11c70 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
11c80 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11c90 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
11ca0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11cb0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
11cc0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11cd0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11ce0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
11cf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11d00 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
11d10 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
11d20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11d30 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11d40 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
11d50 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11d60 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
11d70 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
11d80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11da0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
11db0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
11dc0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
11dd0 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
11de0 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
11df0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
11e00 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
11e10 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
11e20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
11e30 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
11e40 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
11e50 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
11e60 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
11e70 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
11e80 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
11e90 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
11ea0 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
11eb0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
11ec0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
11ed0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
11ee0 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
11ef0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
11f00 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
11f10 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
11f20 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
11f30 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
11f40 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
11f50 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
11f60 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
11f70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
11f80 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
11f90 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
11fa0 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
11fb0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
11fc0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
11fd0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
11fe0 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
11ff0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
12000 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
12010 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
12020 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
12030 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
12040 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
12050 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
12060 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
12070 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
12080 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
12090 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
120a0 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
120b0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
120c0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
120d0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
120e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
120f0 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
12100 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
12110 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
12120 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
12130 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
12140 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12150 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
12160 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
12170 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
12180 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
12190 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
121a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
121b0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
121c0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
121d0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
121e0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
121f0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
12200 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
12210 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12220 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
12230 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
12240 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
12250 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
12260 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
12270 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
12280 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
12290 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
122a0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
122b0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
122c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
122d0 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
122e0 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
122f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
12300 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
12310 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
12320 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12330 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
12340 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
12350 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
12360 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
12370 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
12380 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
12390 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
123a0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
123b0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
123c0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
123d0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
123e0 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
123f0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
12400 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
12410 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
12420 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
12430 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
12440 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
12450 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
12460 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12470 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
12480 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
124a0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
124b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
124c0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
124d0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
124e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
124f0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
12500 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
12510 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
12520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12530 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12540 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12550 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12560 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
12570 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12580 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
12590 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
125a0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
125b0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
125c0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
125d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
125e0 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
125f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12600 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
12610 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
12620 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
12630 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
12640 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
12650 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
12660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12670 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
12680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12690 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
126a0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
126b0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
126c0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
126d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
126e0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
126f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12710 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
12720 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
12730 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
12740 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12750 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
12760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12770 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12780 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
12790 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
127a0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
127b0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
127c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
127d0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
127e0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
127f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
12800 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
12810 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
12820 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
12830 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
12840 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
12850 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
12860 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
12870 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
12880 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
12890 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
128a0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
128b0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
128c0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
128d0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
128e0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
128f0 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
12900 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
12910 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12920 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
12930 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12940 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
12950 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
12960 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
12970 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
12980 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
12990 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
129a0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
129b0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
129c0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
129d0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
129e0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
129f0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
12a00 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
12a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12a20 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
12a30 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
12a40 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
12a50 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
12a60 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
12a70 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
12a80 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
12a90 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
12aa0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
12ab0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
12ac0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
12ad0 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
12ae0 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
12af0 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
12b00 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
12b10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12b20 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
12b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
12b40 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
12b50 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
12b60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
12b70 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
12b80 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
12b90 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
12ba0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
12bb0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
12bc0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
12bd0 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
12be0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
12bf0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
12c00 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
12c10 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
12c20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
12c30 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
12c40 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  , "FOREIGN KEY c
12c50 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
12c60 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
12c70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
12c80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12c90 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
12ca0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12cb0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
12cc0 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
12cd0 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
12ce0 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
12cf0 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
12d00 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
12d10 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
12d20 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
12d30 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
12d40 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
12d50 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
12d60 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
12d70 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
12d80 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
12d90 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
12da0 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
12db0 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
12dc0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
12dd0 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
12de0 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
12df0 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
12e00 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
12e10 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
12e20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
12e30 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
12e40 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
12e50 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
12e60 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
12e70 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
12e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
12e90 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
12ea0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
12eb0 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
12ec0 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
12ed0 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
12ee0 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
12ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12f00 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
12f10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
12f40 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
12f50 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
12f60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
12f70 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
12f80 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
12f90 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
12fa0 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
12fb0 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
12fc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
12fd0 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
12fe0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
12ff0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13000 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
13010 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
13020 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
13030 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
13040 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
13050 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
13060 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
13070 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
13080 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
13090 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
130a0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
130b0 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
130c0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
130d0 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
130e0 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
130f0 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
13100 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
13110 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
13120 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
13130 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
13140 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
13150 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
13160 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
13170 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
13180 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13190 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
131a0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
131b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
131c0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
131d0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  MEM;.  }.  if( p
131e0 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65  ->aOnceFlag ) me
131f0 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  mset(p->aOnceFla
13200 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c  g, 0, p->nOnceFl
13210 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  ag);.  closeAllC
13220 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28  ursors(p);.  if(
13230 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
13240 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
13250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13260 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
13270 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
13280 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
13290 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
132a0 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
132b0 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
132c0 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20   or if the.  ** 
132d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f  SQL statement do
132e0 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77  es not read or w
132f0 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20  rite a database 
13300 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  file.  */.  if( 
13310 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62  p->pc>=0 && p->b
13320 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  IsReader ){.    
13330 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
13340 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
13350 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
13360 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
13370 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
13380 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
13390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
133a0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
133b0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
133c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
133d0 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
133e0 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
133f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
13400 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
13410 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
13420 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
13430 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
13440 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
13450 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
13460 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
13470 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
13480 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
134b0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
134c0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
134d0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
134e0 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
134f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
13500 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
13510 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
13520 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
13530 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
13540 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
13550 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
13560 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
13570 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
13580 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13590 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
135a0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
135b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
135c0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
135d0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
135e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
135f0 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
13600 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
13610 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
13620 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
13630 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
13640 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
13650 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
13660 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
13670 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
13680 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
13690 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
136a0 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
136b0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
136c0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
136d0 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
136e0 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
136f0 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
13700 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
13710 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
13720 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
13730 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
13740 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
13750 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
13760 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
13770 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
13780 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
13790 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
137a0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
137b0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
137c0 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
137d0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
137e0 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
137f0 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
13800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
13810 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
13820 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
13830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13840 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
13850 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
13860 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
13870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
13880 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
13890 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
138a0 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
138b0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
138c0 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
138d0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
138e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
138f0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13900 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
13910 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
13920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13930 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
13940 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
13950 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
13960 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   1;.          db
13970 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  ->bConcurrent = 
13980 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
13990 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
139a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
139b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
139c0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
139d0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
139e0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
139f0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13a10 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
13a20 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
13a30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
13a40 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
13a50 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
13a60 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
13a70 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
13a80 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
13a90 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
13aa0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
13ab0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
13ac0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
13ad0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
13ae0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
13af0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
13b00 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
13b10 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
13b20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
13b30 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
13b40 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
13b50 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
13b60 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
13b70 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
13b80 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
13b90 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
13ba0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
13bb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13bc0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
13bd0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
13be0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
13bf0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13c00 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
13c10 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
13c20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13c40 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
13c50 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
13c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13c70 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
13c80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13c90 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
13ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13cc0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
13cd0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
13ce0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
13cf0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
13d00 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
13d10 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
13d20 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
13d30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
13d40 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
13d50 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
13d60 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
13d70 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
13d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
13d90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
13da0 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
13db0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
13dc0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
13dd0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
13de0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
13df0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
13e00 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
13e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13e20 66 28 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d  f( (rc & 0xFF)==
13e30 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
13e40 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
13e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13e60 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
13e70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13e80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ea0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
13eb0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
13ec0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
13ed0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
13ee0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
13ef0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
13f00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13f10 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
13f20 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
13f30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
13f40 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13f50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13f60 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
13f70 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
13f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13f90 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
13fa0 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
13fb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
13fc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13fd0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
13fe0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
13ff0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14000 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14010 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
14020 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
14030 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14040 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
14050 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14060 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
14070 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
14080 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
14090 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
140a0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
140b0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
140c0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
140d0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
140e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
140f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14120 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14130 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14140 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14150 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14160 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14170 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14180 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
14190 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  ->bConcurrent = 
141a0 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  0;.        p->nC
141b0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
141c0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
141d0 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
141e0 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
141f0 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
14200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
14210 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
14220 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
14230 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
14240 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
14250 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
14260 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
14270 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
14280 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
14290 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
142a0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
142b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
142c0 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
142d0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
142e0 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
142f0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
14300 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
14310 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
14320 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
14330 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14340 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
14350 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
14360 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
14370 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14380 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14390 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
143a0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
143b0 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
143c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
143d0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
143e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
143f0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
14400 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
14410 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
14420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14430 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14440 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14450 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14460 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14470 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14480 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14490 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
144a0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
144b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
144c0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
144d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
144e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
144f0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
14500 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
14510 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14520 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
14530 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
14540 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
14550 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14560 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
14570 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
14580 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
14590 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
145a0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
145b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
145c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
145d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
145e0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
145f0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
14600 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14610 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
14620 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
14630 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14640 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
14650 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
14660 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
14670 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
14680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
14690 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
146a0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
146b0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
146c0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
146d0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
146e0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
146f0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
14700 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
14710 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
14720 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
14730 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
14740 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
14750 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14760 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
14770 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
14780 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
14790 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
147a0 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
147b0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
147c0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
147d0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
147e0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
147f0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
14800 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
14810 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14820 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
14840 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
14850 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
14860 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
14870 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
14880 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
14890 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
148a0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
148b0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
148c0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
148d0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
148e0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
148f0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
14900 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
14910 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
14920 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
14930 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14940 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
14950 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
14960 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
14970 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
14980 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
14990 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
149a0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
149b0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
149c0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
149d0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
149e0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
149f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14a00 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
14a10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
14a20 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
14a30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
14a40 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
14a50 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
14a60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14a70 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
14a80 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
14a90 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
14aa0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
14ab0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
14ac0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
14ad0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
14ae0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
14af0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
14b00 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
14b10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
14b20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
14b30 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
14b40 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
14b50 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
14b60 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
14b70 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
14b80 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
14b90 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
14ba0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
14bb0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
14bc0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
14bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14be0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
14bf0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
14c00 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
14c10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14c20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
14c30 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
14c40 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
14c50 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
14c60 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
14c70 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
14c80 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
14c90 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
14ca0 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
14cb0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
14cc0 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
14cd0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14ce0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
14cf0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
14d00 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
14d10 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
14d20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14d30 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
14d40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14d50 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
14d60 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
14d70 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
14d80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14d90 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
14da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
14db0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14dc0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
14dd0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
14de0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
14df0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
14e00 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
14e10 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
14e20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
14e30 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
14e40 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
14e50 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
14e60 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
14e70 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
14e80 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
14e90 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
14ea0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
14eb0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
14ec0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
14ed0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
14ee0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
14ef0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
14f00 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
14f10 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
14f20 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
14f30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14f40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
14f50 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
14f60 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
14f70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14f80 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
14f90 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
14fa0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
14fb0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
14fc0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
14fd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
14fe0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
14ff0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
15000 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
15010 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
15020 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
15030 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
15040 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
15050 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
15060 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
15070 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
15080 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
15090 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
150a0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
150b0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
150c0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
150d0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
150e0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
150f0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
15100 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
15110 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
15120 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
15130 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
15140 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
15150 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
15160 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
15170 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15180 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
15190 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
151a0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
151b0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
151c0 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
151d0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
151e0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
151f0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
15200 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
15210 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
15220 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
15230 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
15240 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
15250 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
15260 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
15270 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
15280 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
15290 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
152a0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
152b0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
152c0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
152d0 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
152e0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
152f0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
15300 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
15310 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
15320 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
15330 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
15340 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15350 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
15360 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
15370 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15380 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
15390 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
153a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
153b0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
153c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
153d0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
153e0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
153f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
15400 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
15410 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
15420 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
15430 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
15440 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
15450 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
15460 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
15470 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
15480 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
15490 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
154a0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
154b0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
154c0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
154d0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
154e0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
154f0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15500 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15510 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15520 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15530 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15540 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
15550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15560 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
15570 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
15580 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
15590 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
155a0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
155b0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
155c0 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
155d0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
155e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
155f0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15600 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15610 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15620 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15630 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15640 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
15650 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
15660 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
15670 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
15680 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
15690 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
156a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
156b0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
156c0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
156d0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
156e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
156f0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
15700 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
15710 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
15720 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
15730 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15740 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
15750 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
15760 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
15770 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
15780 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15790 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
157a0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
157b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
157c0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
157d0 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
157e0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
157f0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
15800 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
15810 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
15820 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
15830 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
15840 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15850 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
15860 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
15870 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
15880 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15890 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
158a0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
158b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
158c0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
158d0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
158e0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
158f0 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
15900 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15910 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
15920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15930 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
15940 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
15950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
15960 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
15970 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
15980 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
15990 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
159a0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
159b0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
159c0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
159d0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
159e0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
159f0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
15a00 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
15a10 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
15a20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
15a30 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
15a40 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
15a50 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
15a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15a70 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
15a80 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
15a90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15aa0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
15ab0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
15ac0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
15ad0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
15ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15af0 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
15b00 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
15b10 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
15b20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15b30 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
15b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15b50 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15b60 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
15b70 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
15b80 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
15b90 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
15ba0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
15bb0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
15bc0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
15bd0 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
15be0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15bf0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
15c00 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
15c10 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
15c20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
15c30 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
15c40 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
15c50 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
15c60 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
15c70 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
15c80 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
15c90 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
15ca0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
15cb0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
15cc0 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
15cd0 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
15ce0 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
15cf0 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
15d00 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
15d10 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
15d20 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
15d30 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
15d40 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
15d50 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
15d60 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15d70 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
15d80 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
15d90 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
15da0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
15db0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
15dc0 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
15dd0 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
15de0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15df0 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
15e00 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
15e10 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
15e20 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
15e30 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
15e40 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
15e50 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
15e60 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
15e70 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
15e80 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
15e90 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
15ea0 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
15eb0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
15ec0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
15ed0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
15ee0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
15ef0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
15f00 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
15f10 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
15f20 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
15f30 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
15f40 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
15f50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15f60 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
15f70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f80 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
15f90 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
15fa0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
15fb0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
15fc0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
15fd0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15fe0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
15ff0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
16000 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
16010 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
16020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
16030 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
16040 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
16050 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16060 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
16070 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
16080 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
16090 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
160a0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
160b0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
160c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
160d0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
160e0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
160f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16100 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
16110 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
16120 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
16130 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
16140 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
16150 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
16160 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
16170 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
16180 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
16190 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
161a0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
161b0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
161c0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
161d0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
161e0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
161f0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
16200 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
16210 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
16220 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
16230 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
16240 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16250 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
16260 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
16270 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
16280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16290 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
162a0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
162b0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
162c0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
162d0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
162e0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
162f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16300 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
16310 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
16320 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
16330 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
16340 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
16350 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
16360 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16370 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16380 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
16390 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
163a0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
163b0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
163c0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
163d0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
163e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
163f0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16400 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16410 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16420 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16430 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16440 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16450 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16460 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16470 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16480 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16490 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
164a0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
164b0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
164c0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
164d0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
164e0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
164f0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16500 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16510 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16520 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16530 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16540 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16550 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16560 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
16570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
16580 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
16590 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
165a0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
165b0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
165c0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
165d0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
165e0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
165f0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16600 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16610 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16620 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16630 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16640 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
16650 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16660 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
16670 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16680 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
16690 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
166a0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
166b0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
166c0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
166d0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
166e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
166f0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16700 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
16710 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
16720 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
16730 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
16740 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
16750 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
16760 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16770 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
16780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16790 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
167a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
167b0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
167c0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
167d0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
167e0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
167f0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16800 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
16810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16820 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
16830 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
16840 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
16850 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
16860 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
16870 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
16880 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16890 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
168a0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
168b0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
168c0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
168d0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
168e0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
168f0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
16900 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
16910 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
16920 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16930 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
16940 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
16950 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
16960 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
16970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16980 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
16990 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
169a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
169b0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
169c0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
169d0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
169e0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
169f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16a00 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
16a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16a20 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
16a30 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
16a40 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
16a50 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16a60 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
16a70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
16a80 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
16a90 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
16aa0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
16ab0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
16ac0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
16ad0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ae0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16af0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
16b00 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
16b10 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
16b20 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
16b30 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
16b40 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
16b50 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
16b60 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16b70 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
16b80 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
16b90 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16ba0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
16bb0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
16bc0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
16bd0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
16be0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
16bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
16c00 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16c10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16c20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16c30 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16c40 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
16c50 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
16c60 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
16c70 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
16c80 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
16c90 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16ca0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
16cb0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
16cc0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
16cd0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
16ce0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
16cf0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
16d00 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
16d10 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
16d20 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
16d30 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
16d40 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
16d50 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
16d60 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
16d70 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
16d80 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
16d90 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
16da0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16db0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
16dc0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
16dd0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
16de0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
16df0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16e00 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
16e10 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
16e20 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
16e30 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
16e40 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
16e50 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
16e60 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
16e70 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
16e80 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
16e90 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
16ea0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
16eb0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72  ){.  if( p->eCur
16ec0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16ed0 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  REE ){.    if( p
16ee0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
16ef0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16f00 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
16f10 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a  oveto(p);.    }.
16f20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
16f30 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
16f40 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
16f50 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
16f60 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
16f70 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sor(p);.    }.  
16f80 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16f90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16fa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
16fb0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
16fc0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16fd0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
16fe0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16ff0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17000 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
17010 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17020 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
17030 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17040 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
17050 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
17060 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
17070 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
17080 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
17090 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
170a0 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
170b0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
170c0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
170d0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
170e0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
170f0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
17100 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
17110 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
17120 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
17130 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
17140 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
17150 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
17160 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
17170 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
17180 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
17190 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
171a0 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
171b0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
171c0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
171d0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
171e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
171f0 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
17200 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
17210 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
17220 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
17230 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
17240 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
17250 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
17260 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
17270 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
17280 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17290 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
172a0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
172b0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
172c0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
172d0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
172e0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
172f0 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
17300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17310 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17320 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17330 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
17360 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
17390 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
173a0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
173b0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
173c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
173d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
173e0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
173f0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17400 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17410 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
17440 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17450 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
17460 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
17470 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17480 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
174b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
174c0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
174e0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
174f0 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17520 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
17530 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17560 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17570 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
175a0 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
175b0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
175c0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
175d0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
175e0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
175f0 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
17600 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
17610 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
17620 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
17630 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
17640 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
17650 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
17660 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
17670 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
17680 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
17690 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
176a0 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
176b0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
176c0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
176d0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
176e0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
176f0 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
17700 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
17710 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
17720 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
17730 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
17740 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
17750 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
17760 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
17770 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
17780 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
17790 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
177a0 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
177b0 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
177c0 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
177d0 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
177e0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
177f0 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
17800 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
17810 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
17820 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
17830 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
17840 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
17850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
17860 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
17870 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
17880 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
17890 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
178a0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
178b0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
178c0 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
178d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
178e0 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
178f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17900 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17910 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
17920 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
17930 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
17940 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
17950 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
17960 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
17970 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
17980 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
17990 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
179a0 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
179b0 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
179c0 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
179d0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
179e0 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
179f0 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
17a00 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
17a10 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
17a20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
17a30 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
17a40 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
17a50 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
17a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
17a70 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
17a80 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
17a90 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
17aa0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
17ab0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
17ac0 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
17ad0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
17ae0 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
17af0 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
17b00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
17b10 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
17b20 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
17b30 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
17b40 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
17b50 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
17b60 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
17b70 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
17b80 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
17b90 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
17ba0 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
17bb0 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
17bc0 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
17bd0 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
17be0 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
17bf0 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
17c00 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
17c10 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
17c20 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
17c30 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
17c40 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
17c50 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
17c60 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
17c70 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
17c80 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
17c90 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
17ca0 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
17cb0 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
17cc0 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
17cd0 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
17ce0 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
17cf0 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
17d00 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
17d10 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
17d20 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
17d30 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
17d40 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
17d50 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
17d60 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
17d70 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
17d80 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
17d90 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
17da0 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
17db0 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
17dc0 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
17dd0 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
17de0 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
17df0 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
17e00 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
17e10 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
17e20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
17e30 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
17e40 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
17e50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
17e60 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
17e70 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
17e80 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17e90 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
17ea0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
17eb0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
17ec0 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
17ed0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
17ee0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
17ef0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
17f00 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
17f10 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
17f20 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17f30 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
17f40 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
17f50 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
17f60 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17f70 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17f80 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
17f90 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
17fa0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
17fb0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
17fc0 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
17fd0 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
17fe0 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
17ff0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18000 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
18010 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
18020 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
18030 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
18040 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
18050 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
18060 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
18070 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
18080 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
18090 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
180a0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
180b0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
180c0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
180d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
180e0 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
180f0 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
18100 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
18110 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
18120 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
18130 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
18140 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
18150 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
18160 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
18170 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18180 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
18190 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
181a0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
181b0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
181c0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
181d0 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
181e0 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
181f0 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
18200 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
18210 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
18220 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
18230 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
18240 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
18250 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
18260 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
18270 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
18280 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18290 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
182a0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
182b0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
182c0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
182d0 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
182e0 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
182f0 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
18300 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
18310 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
18320 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
18330 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
18340 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
18350 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
18360 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
18370 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
18380 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
18390 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
183a0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
183b0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
183c0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
183d0 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
183e0 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
183f0 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
18400 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
18410 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
18420 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
18430 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
18440 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
18450 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
18460 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18470 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
18480 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
18490 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
184a0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
184b0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
184c0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
184d0 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
184e0 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
184f0 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
18500 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
18510 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
18520 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
18530 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
18540 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
18550 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
18560 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
18570 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
18580 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
18590 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
185a0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
185b0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
185c0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
185d0 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
185e0 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
185f0 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
18600 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
18610 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
18620 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
18630 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
18640 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
18650 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
18660 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
18670 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
18680 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
18690 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
186a0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
186b0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
186c0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
186d0 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
186e0 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
186f0 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
18700 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
18710 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
18720 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
18730 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
18740 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
18750 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
18760 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18770 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
18780 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
18790 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
187a0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
187b0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
187c0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
187d0 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
187e0 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
187f0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
18800 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
18810 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
18820 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
18830 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
18840 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
18850 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18860 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
18870 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
18880 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
18890 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
188a0 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
188b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
188c0 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
188d0 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
188e0 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
188f0 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
18900 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
18910 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
18920 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
18930 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
18940 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18950 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18960 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
18970 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
18980 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
18990 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
189a0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
189b0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
189c0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
189d0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
189e0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
189f0 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
18a00 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
18a10 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
18a20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
18a30 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
18a40 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
18a50 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
18a60 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
18a70 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
18a80 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
18a90 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
18aa0 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
18ab0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
18ac0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
18ad0 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
18ae0 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
18af0 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
18b00 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
18b10 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
18b20 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
18b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18b40 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
18b50 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
18b60 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
18b70 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18b80 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
18b90 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
18ba0 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
18bb0 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
18bc0 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
18bd0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
18be0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
18bf0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
18c00 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
18c10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18c20 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
18c30 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
18c40 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
18c50 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
18c60 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
18c70 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
18c80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18c90 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
18ca0 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
18cb0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
18cc0 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
18cd0 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
18ce0 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
18cf0 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
18d00 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
18d10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18d20 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20   Input "x" is a 
18d30 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69  sequence of unsi
18d40 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20  gned characters 
18d50 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61  that represent a
18d60 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  .** big-endian i
18d70 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20  nteger.  Return 
18d80 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  the equivalent n
18d90 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
18da0 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54  .#define ONE_BYT
18db0 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38  E_INT(x)    ((i8
18dc0 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65  )(x)[0]).#define
18dd0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29   TWO_BYTE_INT(x)
18de0 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78      (256*(i8)((x
18df0 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64  )[0])|(x)[1]).#d
18e00 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45  efine THREE_BYTE
18e10 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a  _INT(x)  (65536*
18e20 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
18e30 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29  )[1]<<8)|(x)[2])
18e40 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
18e50 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75  TE_UINT(x)  (((u
18e60 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
18e70 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
18e80 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
18e90 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
18ea0 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32  E_INT(x) (167772
18eb0 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  16*(i8)((x)[0])|
18ec0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
18ed0 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
18ee0 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
18ef0 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
18f00 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
18f10 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
18f20 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
18f30 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
18f40 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
18f50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18f60 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
18f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18f80 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
18f90 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61  nted as two sepa
18fa0 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f  rate routines fo
18fb0 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  r performance..*
18fc0 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20  * The few cases 
18fd0 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63  that require loc
18fe0 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
18ff0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
19000 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72   a separate.** r
19010 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69  outine so that i
19020 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65  n most cases the
19030 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76   overhead of mov
19040 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f  ing the stack po
19050 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69  inter.** is avoi
19060 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ded..*/ .static 
19070 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  u32 SQLITE_NOINL
19080 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20  INE serialGet(. 
19090 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
190a0 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
190b0 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
190c0 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
190d0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
190e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
190f0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
19100 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
19110 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
19140 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
19150 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  nto */.){.  u64 
19160 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
19170 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79  NT(buf);.  u32 y
19180 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
19190 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20  T(buf+4);.  x = 
191a0 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69  (x<<32) + y;.  i
191b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
191c0 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  6 ){.    /* EVID
191d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31  ENCE-OF: R-29851
191e0 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20  -52272 Value is 
191f0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d  a big-endian 64-
19200 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d  bit.    ** twos-
19210 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19220 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d  er. */.    pMem-
19230 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
19240 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
19250 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19260 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19270 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73  >u.i<0 );.  }els
19280 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
19290 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34  CE-OF: R-57343-4
192a0 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20  9114 Value is a 
192b0 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20  big-endian IEEE 
192c0 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a  754-2008 64-bit.
192d0 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
192e0 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f  point number. */
192f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
19300 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
19310 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
19320 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
19330 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
19340 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
19350 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
19360 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
19370 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64  .    ** byte ord
19380 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
19390 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
193a0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
193b0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e   is.    ** defin
193c0 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
193d0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
193e0 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
193f0 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64  mixed.    ** end
19400 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ian..    */.    
19410 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
19420 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
19430 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
19440 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
19450 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
19460 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
19470 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19480 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
19490 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
194a0 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
194b0 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
194c0 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
194d0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
194e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
194f0 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
19500 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29  (pMem->u.r)==8 )
19510 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
19520 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
19530 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
19540 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  >u.r, &x, sizeof
19550 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  (x));.    pMem->
19560 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
19570 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  sNaN(pMem->u.r) 
19580 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
19590 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  _Real;.  }.  ret
195a0 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c  urn 8;.}.u32 sql
195b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
195c0 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
195d0 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
195e0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
195f0 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
19600 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
19610 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
19620 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
19630 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
19640 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
19670 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19680 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19690 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
196a0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
196b0 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
196c0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
196d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
196e0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
196f0 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
19700 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
19710 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
19720 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19730 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
19740 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
19750 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
19760 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
19770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
19790 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
197a0 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
197b0 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
197c0 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
197d0 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
197e0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
197f0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
19800 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
19810 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19820 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19840 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19850 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19860 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
19870 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
19880 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
198a0 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
198b0 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
198c0 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
198d0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
198e0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
198f0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19900 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
19910 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
19920 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19930 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
19940 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
19950 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
19960 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
19970 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
19980 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
19990 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
199a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
199b0 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
199c0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
199d0 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
199e0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
199f0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
19a00 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
19a10 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
19a20 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19a30 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19a50 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19a60 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
19a70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
19a80 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
19a90 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19aa0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19ab0 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
19ac0 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
19ad0 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
19ae0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19af0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19b00 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19b10 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
19b20 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66  INT(buf);.#ifdef
19b30 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20   __HP_cc .      
19b40 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* Work around a
19b50 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20   sign-extension 
19b60 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f  bug in the HP co
19b70 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58  mpiler for HP/UX
19b80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75   */.      if( bu
19b90 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d  f[0]&0x80 ) pMem
19ba0 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66  ->u.i |= 0xfffff
19bb0 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23  fff80000000LL;.#
19bc0 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d  endif.      pMem
19bd0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19be0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19bf0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19c00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
19c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19c20 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
19c30 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19c40 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19c50 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d  NCE-OF: R-50385-
19c60 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61  09674 Value is a
19c70 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62   big-endian 48-b
19c80 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
19c90 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
19ca0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
19cb0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
19cc0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
19cd0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
19ce0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
19cf0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
19d00 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19d10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19d20 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
19d40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
19d50 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
19d60 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19d70 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
19d80 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
19d90 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
19da0 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
19db0 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
19dc0 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
19dd0 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
19de0 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
19df0 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
19e00 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
19e10 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
19e20 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
19e30 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
19e40 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
19e50 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
19e60 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
19e70 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
19e80 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
19e90 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  er 1 */.      /*
19ea0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19eb0 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75  12976-22893 Valu
19ec0 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
19ed0 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   0. */.      /* 
19ee0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19ef0 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65  8143-12121 Value
19f00 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
19f10 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  1. */.      pMem
19f20 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
19f30 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
19f40 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
19f50 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
19f60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
19f70 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
19f80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19f90 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c  -14606-31564 Val
19fa0 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61  ue is a BLOB tha
19fb0 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79  t is (N-12)/2 by
19fc0 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  tes in.      ** 
19fd0 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a  length..      **
19fe0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19ff0 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75  28401-00140 Valu
1a000 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e  e is a string in
1a010 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
1a020 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ng and.      ** 
1a030 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69  (N-13)/2 bytes i
1a040 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20  n length. */.   
1a050 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1a060 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
1a070 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
1a080 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
1a090 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
1a0a0 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
1a0b0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
1a0c0 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
1a0d0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
1a0e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
1a0f0 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
1a100 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
1a110 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
1a120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a130 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
1a140 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
1a150 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
1a160 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
1a170 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
1a180 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
1a190 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
1a1a0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
1a1b0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1a1c0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
1a1d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1a1e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
1a1f0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
1a200 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
1a210 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
1a220 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
1a230 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
1a240 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
1a250 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
1a260 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
1a270 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
1a280 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
1a290 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
1a2a0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
1a2b0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
1a2c0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
1a2d0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
1a2e0 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
1a2f0 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
1a300 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
1a310 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1a320 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
1a330 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
1a340 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
1a350 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
1a360 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
1a370 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1a380 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
1a390 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1a3a0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1a3b0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
1a3c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
1a3d0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
1a3e0 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1a3f0 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
1a400 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1a410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a420 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1a430 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
1a440 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
1a470 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
1a480 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
1a4b0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
1a4c0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
1a4d0 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
1a4e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
1a4f0 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
1a500 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
1a510 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
1a520 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
1a530 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
1a540 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
1a550 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
1a580 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
1a590 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
1a5a0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a5d0 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1a5e0 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
1a5f0 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
1a600 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
1a610 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
1a620 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
1a630 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
1a640 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
1a650 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
1a660 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
1a670 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
1a680 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
1a690 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
1a6a0 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
1a6b0 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
1a6c0 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
1a6d0 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
1a6e0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
1a6f0 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
1a700 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
1a710 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1a720 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
1a730 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
1a740 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
1a750 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
1a760 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
1a770 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1a780 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1a790 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1a7a0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
1a7b0 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
1a7c0 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
1a7d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1a7e0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
1a7f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
1a800 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
1a810 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
1a820 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
1a830 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1a840 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1a850 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1a860 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1a870 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1a880 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1a890 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1a8a0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1a8b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1a8c0 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
1a8d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1a8e0 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
1a8f0 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
1a900 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
1a910 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
1a920 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
1a930 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1a940 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
1a950 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
1a960 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1a970 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
1a980 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
1a990 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1a9a0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
1a9b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1a9c0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1a9d0 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
1a9e0 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
1a9f0 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1aa00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1aa10 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1aa20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1aa30 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1aa40 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
1aa50 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1aa60 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
1aa70 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
1aa80 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
1aa90 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
1aaa0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1aab0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1aac0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1aad0 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
1aae0 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1ab10 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
1ab20 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
1ab30 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab50 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1ab60 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
1ab70 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
1ab80 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
1ab90 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
1aba0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
1abb0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1abc0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
1abd0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1abe0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1abf0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
1ac00 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
1ac10 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65  <szHdr && d<=nKe
1ac20 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
1ac30 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
1ac40 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1ac50 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
1ac60 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1ac70 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
1ac80 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
1ac90 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
1aca0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
1acb0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
1acc0 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
1acd0 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
1ace0 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
1acf0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61  /.    pMem->szMa
1ad00 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
1ad10 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1ad20 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
1ad30 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
1ad40 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
1ad50 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
1ad60 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
1ad70 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
1ad80 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1ad90 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
1ada0 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
1adb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1adc0 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
1add0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1ade0 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
1adf0 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
1ae00 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
1ae10 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
1ae20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ae30 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
1ae40 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
1ae50 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
1ae60 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1ae70 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
1ae80 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
1ae90 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
1aea0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
1aeb0 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
1aec0 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
1aed0 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
1aee0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1aef0 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
1af00 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
1af10 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
1af20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1af30 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
1af40 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
1af50 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
1af60 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1af70 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
1af80 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
1af90 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
1afa0 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
1afb0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1afc0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1afd0 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
1afe0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1aff0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1b000 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
1b010 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b020 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1b030 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
1b040 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1b050 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
1b060 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
1b070 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
1b080 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
1b090 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
1b0a0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1b0b0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1b0c0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1b0d0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1b0e0 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1b0f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1b100 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1b110 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
1b120 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1b130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b140 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
1b150 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
1b160 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1b170 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
1b180 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1b190 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b1a0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1b1b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1b1c0 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
1b1d0 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
1b1e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1b1f0 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1b200 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
1b210 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
1b220 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1b230 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1b240 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
1b250 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
1b260 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
1b270 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
1b280 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b290 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
1b2a0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1b2b0 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1b2c0 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1b2d0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
1b2e0 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
1b2f0 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
1b300 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
1b310 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
1b320 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
1b330 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
1b340 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
1b350 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
1b360 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
1b370 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
1b380 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
1b390 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
1b3a0 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
1b3b0 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
1b3c0 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
1b3d0 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
1b3e0 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
1b3f0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
1b400 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
1b410 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
1b420 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
1b430 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
1b440 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
1b450 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
1b460 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
1b470 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
1b480 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
1b490 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1b4a0 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
1b4b0 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
1b4c0 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
1b4d0 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
1b4e0 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
1b4f0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1b500 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1b510 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72  r1);.  if( szHdr
1b520 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e  1>98307 ) return
1b530 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1b540 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
1b550 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b560 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1b570 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
1b580 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1b590 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b5a0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b5b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1b5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1b5d0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1b5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1b5f0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1b600 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1b610 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b620 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
1b630 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
1b640 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
1b650 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
1b660 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
1b670 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
1b680 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
1b690 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
1b6a0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
1b6b0 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
1b6c0 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
1b6d0 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
1b6e0 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
1b6f0 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
1b700 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1b710 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
1b720 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
1b730 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
1b740 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1b750 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
1b760 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
1b770 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
1b780 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
1b790 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
1b7a0 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
1b7b0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
1b7c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1b7d0 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
1b7e0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
1b7f0 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
1b800 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
1b810 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
1b820 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
1b830 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1b840 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
1b850 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
1b860 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b870 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1b880 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
1b890 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
1b8a0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1b8b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b8c0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1b8d0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
1b8e0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
1b8f0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
1b900 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b910 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
1b920 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
1b930 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
1b940 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
1b950 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b960 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1b970 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1b980 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1b990 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
1b9a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1b9b0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1b9c0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
1b9d0 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
1b9e0 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
1b9f0 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
1ba00 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64    }.      goto d
1ba10 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a  ebugCompareEnd;.
1ba20 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
1ba30 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a   }while( idx1<sz
1ba40 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1ba50 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f  ->nField );..  /
1ba60 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1ba70 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1ba80 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1ba90 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1baa0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1bab0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1bac0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1bad0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1bae0 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1baf0 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1bb00 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1bb10 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1bb20 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
1bb30 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1bb40 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1bb50 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1bb60 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
1bb70 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1bb80 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1bb90 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1bba0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1bbb0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1bbc0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1bbd0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1bbe0 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e  .  rc = pPKey2->
1bbf0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62  default_rc;..deb
1bc00 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20  ugCompareEnd:.  
1bc10 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1bc20 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20  t==0 && rc==0 ) 
1bc30 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1bc40 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20  desiredResult<0 
1bc50 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  && rc<0 ) return
1bc60 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1bc70 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e  dResult>0 && rc>
1bc80 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bc90 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1bca0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1bcb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1bcc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1bcd0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
1bce0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
1bcf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1bd00 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1bd10 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1bd20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
1bd30 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
1bd40 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
1bd50 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
1bd60 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
1bd70 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
1bd80 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1bd90 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
1bda0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1bdb0 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  d + pKeyInfo->nX
1bdc0 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1bdd0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1bde0 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1bdf0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1be00 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1be10 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1be20 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1be30 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1be40 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1be50 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1be60 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1be70 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1be80 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1be90 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1bea0 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1beb0 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  nField or KeyInf
1bec0 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73  o.nXField values
1bed0 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1bee0 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1bef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1bf00 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1bf10 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1bf20 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1bf30 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1bf40 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1bf50 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1bf60 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1bf70 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1bf80 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1bf90 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1bfa0 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1bfb0 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1bfc0 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1bfd0 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1bfe0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1bff0 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1c000 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1c010 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1c020 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c030 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1c040 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1c050 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1c060 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1c070 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1c080 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1c090 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1c0a0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1c0b0 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1c0c0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1c0d0 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1c0e0 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1c0f0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1c100 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c110 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1c120 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1c130 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1c140 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1c150 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1c160 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1c170 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1c180 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1c190 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1c1a0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1c1b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c1c0 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1c1d0 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1c1e0 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1c1f0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1c200 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1c210 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c220 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1c230 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1c240 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1c250 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1c260 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1c270 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1c280 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1c290 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1c2a0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1c2b0 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1c2c0 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1c2d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1c2e0 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1c310 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1c320 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1c330 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1c340 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1c350 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1c360 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1c370 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1c380 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1c390 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1c3a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1c3b0 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1c3c0 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1c3d0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1c3e0 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1c3f0 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1c400 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1c410 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1c420 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1c430 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
1c440 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
1c450 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1c460 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c470 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1c480 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c490 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c4a0 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1c4b0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1c4c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c4d0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1c4e0 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1c4f0 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1c500 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1c510 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1c520 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1c530 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1c540 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1c550 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1c560 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
1c570 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
1c580 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
1c590 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1c5a0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1c5b0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1c5c0 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
1c5d0 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
1c5e0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1c5f0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
1c600 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
1c610 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c620 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1c630 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c640 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1c650 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1c660 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
1c670 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1c680 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
1c690 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1c6a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1c6b0 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1c6c0 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1c6d0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1c6e0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1c6f0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1c700 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1c710 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1c720 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1c730 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1c740 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1c750 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1c760 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1c770 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1c780 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1c790 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1c7a0 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1c7b0 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1c7c0 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1c7d0 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1c7e0 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d  >z, pB2->z, pB1-
1c7f0 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d  >n>pB2->n ? pB2-
1c800 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20  >n : pB1->n);.  
1c810 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1c820 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e  ;.  return pB1->
1c830 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f  n - pB2->n;.}../
1c840 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1c850 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1c860 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1c870 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1c880 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1c890 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1c8a0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1c8b0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1c8c0 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1c8d0 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1c8e0 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1c8f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1c900 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1c910 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1c920 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1c930 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1c940 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1c950 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1c960 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1c970 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1c980 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1c990 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1c9a0 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1c9b0 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1c9c0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1c9d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1c9e0 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1c9f0 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1ca00 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1ca10 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1ca20 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1ca30 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34   r>9223372036854
1ca40 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72  775807.0 ) retur
1ca50 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69  n -1;.    y = (i
1ca60 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c  64)r;.    if( i<
1ca70 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  y ) return -1;. 
1ca80 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20     if( i>y ){.  
1ca90 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c      if( y==SMALL
1caa0 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30  EST_INT64 && r>0
1cab0 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1cac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b        return +1;
1cad0 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28  .    }.    s = (
1cae0 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66  double)i;.    if
1caf0 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( s<r ) return -
1cb00 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29  1;.    if( s>r )
1cb10 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1cb20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
1cb30 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cb40 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
1cb50 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
1cb60 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
1cb70 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
1cb80 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
1cb90 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
1cba0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cbb0 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1cbc0 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
1cbd0 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
1cbe0 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
1cbf0 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
1cc00 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
1cc10 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
1cc20 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
1cc30 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
1cc40 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
1cc50 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1cc60 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
1cc70 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
1cc80 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
1cc90 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
1cca0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
1ccb0 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
1ccc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1ccd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1cce0 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
1ccf0 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
1cd00 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
1cd10 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1cd20 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32  l){.  int f1, f2
1cd30 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64  ;.  int combined
1cd40 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20  _flags;..  f1 = 
1cd50 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
1cd60 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
1cd70 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
1cd80 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61  ags = f1|f2;.  a
1cd90 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64  ssert( (combined
1cda0 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  _flags & MEM_Row
1cdb0 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f  Set)==0 );. .  /
1cdc0 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1cdd0 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65  s NULL, it is le
1cde0 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  ss than the othe
1cdf0 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  r. If both value
1ce00 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c  s.  ** are NULL,
1ce10 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
1ce20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1ce30 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1ce40 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26  .    return (f2&
1ce50 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26  MEM_Null) - (f1&
1ce60 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a  MEM_Null);.  }..
1ce70 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e    /* At least on
1ce80 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c  e of the two val
1ce90 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a  ues is a number.
1cea0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1ceb0 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1cec0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1ced0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1cee0 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1cef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1cf00 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1cf10 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1cf20 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1cf30 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1cf40 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1cf50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cf60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1cf70 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1cf80 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1cf90 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1cfa0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1cfb0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1cfc0 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
1cfd0 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1cfe0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1cff0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1d000 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1d010 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1d020 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
1d030 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1d040 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
1d050 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1d060 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
1d070 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1d080 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d090 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1d0a0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1d0b0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1d0c0 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1d0d0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1d0e0 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
1d0f0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1d100 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
1d110 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
1d120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d130 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1d150 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
1d160 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1d170 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1d180 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1d190 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1d1a0 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1d1b0 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1d1c0 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1d1d0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1d1e0 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1d1f0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d200 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1d210 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1d220 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1d230 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1d240 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1d250 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1d260 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1d270 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1d280 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1d290 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20  Mem2->enc );.   
1d2a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1d2b0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1d2c0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1d2d0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1d2e0 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1d2f0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1d300 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1d310 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1d320 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1d330 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1d340 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1d350 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1d360 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1d370 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1d380 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1d390 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1d3a0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1d3b0 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1d3c0 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1d3d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1d3e0 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1d3f0 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1d400 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1d410 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1d420 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1d430 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1d440 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1d450 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1d460 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1d470 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1d480 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1d490 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1d4a0 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1d4b0 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1d4c0 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1d4d0 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1d4e0 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1d4f0 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1d500 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1d510 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1d520 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1d530 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1d540 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1d550 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1d560 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1d570 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1d580 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1d590 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1d5a0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1d5b0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1d5c0 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1d5d0 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1d5e0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1d5f0 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1d600 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1d610 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1d620 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1d630 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1d640 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1d650 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1d660 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1d670 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1d680 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1d690 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1d6a0 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1d6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1d6c0 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1d6d0 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1d6e0 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1d6f0 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1d700 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1d710 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1d720 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1d730 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1d740 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d760 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1d770 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1d780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d790 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1d7b0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d7c0 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1d7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d7e0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d7f0 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1d800 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1d810 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1d820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d830 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d840 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1d850 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1d860 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1d870 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1d880 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1d890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d8a0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d8b0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1d8c0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1d8d0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1d8e0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1d8f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
1d900 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
1d910 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1d920 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1d930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d940 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d950 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1d960 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1d970 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1d980 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1d990 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
1d9a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
1d9b0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
1d9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d9d0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1d9e0 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
1d9f0 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
1da00 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
1da10 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
1da20 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
1da30 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
1da40 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
1da50 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
1da60 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
1da70 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1da80 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
1da90 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
1daa0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1dab0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
1dac0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
1dad0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1dae0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1daf0 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1db00 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1db10 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1db20 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1db30 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1db40 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1db50 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1db60 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1db70 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1db80 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1db90 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1dba0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1dbb0 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1dbc0 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1dbd0 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1dbe0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1dbf0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1dc00 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1dc10 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1dc20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1dc30 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1dc40 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1dc50 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1dc60 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1dc70 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1dc80 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1dc90 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1dca0 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1dcb0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
1dcc0 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
1dcd0 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
1dce0 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
1dcf0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1dd00 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
1dd10 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
1dd20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1dd30 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
1dd40 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
1dd50 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
1dd60 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
1dd70 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
1dd80 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
1dd90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1dda0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1ddb0 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
1ddc0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1ddd0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1dde0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1ddf0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1de00 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1de10 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1de20 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de40 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1de50 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1de60 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1de90 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1dea0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1deb0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1dee0 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1def0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1df00 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1df30 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1df40 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1df70 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1df80 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1df90 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1dfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dfb0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1dfc0 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1dfd0 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1dfe0 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1dff0 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1e000 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1e010 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1e020 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1e030 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e040 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1e050 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1e060 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1e070 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1e080 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1e090 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1e0a0 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1e0b0 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1e0c0 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1e0d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1e0e0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1e0f0 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1e100 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1e110 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1e120 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1e130 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1e140 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1e150 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1e160 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1e170 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1e180 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1e190 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1e1a0 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1e1b0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1e1c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e1d0 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1e1e0 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1e1f0 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1e200 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1e210 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1e220 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1e230 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1e240 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1e250 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1e260 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1e270 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1e280 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1e290 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
1e2a0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1e2b0 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1e2c0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1e2d0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1e2e0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1e2f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1e300 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1e310 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1e320 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1e330 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1e340 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1e350 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1e360 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e370 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1e380 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1e390 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1e3a0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e3b0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1e3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1e3d0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1e3e0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1e3f0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1e400 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1e410 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1e420 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1e430 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1e440 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1e450 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1e460 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1e470 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1e480 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1e490 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1e4a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e4b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e4c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e4d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e4e0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1e4f0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1e500 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1e510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1e520 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1e530 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1e540 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1e550 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
1e560 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
1e570 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
1e580 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1e590 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
1e5a0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
1e5b0 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
1e5c0 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
1e5d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
1e5e0 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
1e5f0 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1e600 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1e610 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1e620 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1e630 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1e640 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1e650 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e660 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
1e670 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
1e680 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1e690 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
1e6a0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1e6b0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1e6c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1e6d0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1e6e0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1e6f0 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
1e700 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
1e710 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
1e720 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
1e730 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
1e740 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
1e750 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
1e760 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
1e770 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
1e780 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
1e790 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
1e7a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1e7b0 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
1e7c0 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
1e7d0 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
1e7e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
1e7f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e800 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e810 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1e820 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1e840 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e850 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1e860 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1e870 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1e880 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1e890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e8a0 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
1e8b0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1e8c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1e8d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e8e0 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
1e8f0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1e900 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1e910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e930 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
1e940 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
1e950 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
1e960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e970 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e980 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
1e990 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
1e9a0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1e9b0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
1e9c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1e9d0 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1e9e0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1e9f0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1ea00 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1ea10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1ea20 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
1ea30 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1ea40 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1ea50 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1ea60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1ea70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ea80 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
1ea90 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1eaa0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1eab0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1eac0 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
1ead0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1eae0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1eaf0 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
1eb00 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1eb10 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
1eb20 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
1eb30 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1eb40 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1eb50 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1eb60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1eb70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1eb80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1eb90 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1eba0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ebb0 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
1ebc0 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
1ebd0 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
1ebe0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1ebf0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1ec00 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ec10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
1ec20 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
1ec30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
1ec40 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
1ec50 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
1ec60 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
1ec70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
1ec90 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
1eca0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
1ecb0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
1ecc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1ecd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ece0 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
1ecf0 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
1ed00 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1ed10 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1ed20 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1ed30 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1ed40 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1ed50 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
1ed60 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
1ed70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ed80 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
1ed90 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
1eda0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1edb0 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
1edc0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1edd0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1ede0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1edf0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1ee00 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1ee10 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1ee20 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
1ee30 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1ee40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1ee50 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ee60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
1ee70 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1ee80 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1ee90 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1eea0 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
1eeb0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1eec0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1eed0 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
1eee0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1eef0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
1ef00 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
1ef10 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1ef20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1ef30 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1ef40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ef50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1ef80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ef90 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1efa0 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70  mp = MIN(nStr, p
1efb0 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1efc0 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1efd0 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1efe0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1eff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1f000 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
1f010 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s->n;.        }.
1f020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f030 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c     /* RHS is nul
1f040 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20  l */.    else{. 
1f050 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1f060 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1f070 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69        rc = (seri
1f080 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20  al_type!=0);.   
1f090 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
1f0a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1f0b0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1f0c0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1f0d0 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
1f0e0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1f0f0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1f100 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1f110 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1f120 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  c) );.      asse
1f130 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1f140 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1f150 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1f160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b  ;.    }..    i++
1f180 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1f190 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1f1a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1f1b0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1f1c0 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
1f1d0 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
1f1e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
1f1f0 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
1f200 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70  ed)szHdr1 && i<p
1f210 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26  PKey2->nField &&
1f220 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
1f230 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
1f240 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f250 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1f260 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1f270 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1f280 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1f290 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1f2a0 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1f2b0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1f2c0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1f2d0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1f2e0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1f2f0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1f300 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1f310 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1f320 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1f330 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1f340 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
1f350 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1f360 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1f370 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1f380 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1f390 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1f3a0 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1f3b0 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1f3c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
1f3d0 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
1f3e0 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
1f3f0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1f400 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1f410 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1f420 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
1f430 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1f440 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
1f450 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
1f460 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
1f470 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1f480 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
1f490 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f4a0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
1f4b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1f4c0 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1f4d0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f4e0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1f4f0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1f500 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
1f510 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1f520 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1f530 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1f540 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a   pPKey2, 0);.}..
1f550 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f560 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
1f570 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1f580 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f590 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
1f5a0 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
1f5b0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1f5c0 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
1f5d0 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
1f5e0 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1f5f0 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
1f600 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1f610 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1f620 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
1f630 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
1f640 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
1f650 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
1f660 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
1f670 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
1f680 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
1f690 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
1f6a0 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
1f6b0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
1f6c0 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
1f6d0 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
1f6e0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1f6f0 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
1f700 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1f710 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1f720 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1f730 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1f740 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1f750 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1f760 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
1f770 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
1f780 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
1f790 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
1f7a0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1f7b0 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
1f7c0 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
1f7d0 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
1f7e0 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20   u64 x;.  i64 v 
1f7f0 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
1f800 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73  ].u.i;.  i64 lhs
1f810 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
1f820 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1f830 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
1f840 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
1f850 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
1f860 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
1f870 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
1f880 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
1f890 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1f8a0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
1f8b0 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
1f8c0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1f8d0 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
1f8e0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1f8f0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1f900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f910 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1f920 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1f930 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1f940 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
1f950 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1f960 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1f970 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1f980 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f990 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1f9a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1f9b0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1f9c0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1f9d0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1f9e0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f9f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fa00 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1fa10 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1fa20 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1fa30 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1fa40 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1fa50 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
1fa60 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
1fa70 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1fa80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fa90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1faa0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1fab0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1fac0 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
1fad0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1fae0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1faf0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1fb00 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1fb10 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1fb20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fb30 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1fb40 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1fb50 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1fb60 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
1fb70 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1fb80 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1fb90 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1fba0 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
1fbb0 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
1fbc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fbd0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fbe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fbf0 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
1fc00 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
1fc10 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
1fc20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
1fc30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1fc40 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
1fc50 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
1fc60 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
1fc70 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1fc80 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
1fc90 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
1fca0 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
1fcb0 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
1fcc0 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
1fcd0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
1fce0 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
1fcf0 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
1fd00 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
1fd10 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
1fd20 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
1fd30 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
1fd40 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
1fd50 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
1fd60 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
1fd70 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
1fd80 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
1fd90 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
1fda0 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
1fdb0 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
1fdc0 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
1fdd0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
1fde0 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
1fdf0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1fe00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1fe10 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1fe20 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
1fe30 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1fe40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fe50 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1fe60 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1fe70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
1fe80 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1fe90 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
1fea0 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
1feb0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1fec0 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
1fed0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1fee0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
1fef0 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1ff00 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1ff10 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
1ff20 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
1ff30 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
1ff40 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
1ff50 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ff60 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1ff70 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1ff80 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1ff90 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
1ffa0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
1ffb0 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
1ffc0 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
1ffd0 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
1ffe0 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
1fff0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
20000 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
20010 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
20020 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
20030 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e  rc;.    pPKey2->
20040 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  eqSeen = 1;.  }.
20050 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
20060 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20070 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20080 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
20090 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
200a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
200b0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
200c0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
200d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
200e0 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
200f0 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
20100 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
20110 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
20120 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
20130 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
20140 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
20150 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
20160 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
20170 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20180 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
20190 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
201a0 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
201b0 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
201c0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
201d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
201e0 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
201f0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
20200 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
20210 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20220 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20230 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20240 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
20250 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
20260 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
20270 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
20280 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
20290 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d  sert( pPKey2->aM
202a0 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[0].flags & ME
202b0 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41  M_Str );.  vdbeA
202c0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
202d0 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
202e0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
202f0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
20300 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
20310 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
20320 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
20330 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
20340 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
20350 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
20360 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
20370 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
20380 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
20390 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
203a0 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
203b0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
203c0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
203d0 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
203e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
203f0 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
20400 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
20410 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
20420 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
20430 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
20440 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
20450 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
20460 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
20470 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
20480 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20490 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
204a0 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
204b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
204c0 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
204d0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
204e0 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
204f0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
20500 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
20510 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
20520 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
20530 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
20540 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
20550 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
20560 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
20570 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
20580 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
20590 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
205a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
205b0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
205c0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
205d0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
205e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
205f0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20600 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
20610 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
20620 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  eqSeen = 1;.    
20630 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
20640 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
20650 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
20660 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
20670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
20680 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
20690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
206a0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
206b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
206c0 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
206d0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
206e0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
206f0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
20700 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20710 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
20720 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
20730 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
20740 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
20750 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20760 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
20770 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
20780 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
20790 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
207a0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
207b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
207c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
207d0 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
207e0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
207f0 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
20800 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
20810 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
20820 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
20830 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
20840 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
20850 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
20860 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
20870 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
20880 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20890 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
208a0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
208b0 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
208c0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
208d0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
208e0 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
208f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
20900 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
20910 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
20920 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
20930 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
20940 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
20950 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
20960 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
20970 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
20980 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
20990 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
209a0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
209b0 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
209c0 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
209d0 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
209e0 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
209f0 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
20a00 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
20a10 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
20a20 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
20a30 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
20a40 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
20a50 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20a60 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
20a70 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
20a80 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
20a90 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
20aa0 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
20ab0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
20ac0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
20ad0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
20ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
20af0 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
20b00 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
20b10 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
20b20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
20b30 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
20b40 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
20b50 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
20b60 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
20b70 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
20b80 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
20b90 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
20ba0 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
20bb0 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
20bc0 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
20bd0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
20be0 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
20bf0 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
20c00 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
20c10 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
20c20 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
20c30 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
20c40 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
20c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20c60 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
20c70 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
20c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
20c90 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
20ca0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
20cb0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20cc0 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
20cd0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
20ce0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
20cf0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
20d00 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
20d10 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
20d20 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
20d30 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
20d40 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
20d50 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
20d60 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
20d70 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
20d80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20d90 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
20da0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20db0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20dc0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
20dd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
20de0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20df0 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
20e00 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
20e10 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
20e20 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
20e30 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
20e40 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
20e50 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
20e60 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
20e70 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
20e80 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
20e90 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
20ea0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
20eb0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
20ec0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
20ed0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
20ee0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
20ef0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
20f00 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
20f10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
20f20 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
20f30 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
20f40 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
20f50 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
20f60 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
20f70 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
20f80 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
20f90 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
20fa0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
20fb0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
20fc0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
20fd0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
20fe0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
20ff0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
21000 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
21010 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
21020 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
21030 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
21040 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21050 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
21060 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
21070 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21080 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
21090 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
210a0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
210b0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
210c0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
210d0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
210e0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
210f0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
21100 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
21110 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
21120 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21130 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
21140 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
21150 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
21160 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
21170 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
21180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21190 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
211a0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
211b0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
211c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
211d0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
211e0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
211f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
21200 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
21210 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
21220 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
21230 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
21240 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
21250 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
21260 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
21270 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
21280 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
21290 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
212a0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
212b0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
212c0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
212d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
212e0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
212f0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
21300 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
21310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
21330 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
21340 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
21350 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
21360 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
21370 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
21380 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
21390 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
213a0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
213b0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
213c0 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
213d0 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
213e0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
213f0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
21400 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
21410 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
21420 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
21430 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
21440 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
21450 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
21460 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
21470 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
21480 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
21490 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
214a0 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
214b0 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
214c0 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
214d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
214e0 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
214f0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21500 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
21510 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21520 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
21530 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
21540 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21550 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
21560 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21570 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
21580 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21590 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
215a0 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
215b0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
215c0 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
215d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
215e0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
215f0 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
21600 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
21610 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77  ypeSizes[typeRow
21620 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id];.  testcase(
21630 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
21640 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
21650 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
21660 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
21670 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
21680 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
21690 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
216a0 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
216b0 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
216c0 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
216d0 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
216e0 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
216f0 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
21700 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
21710 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
21720 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
21730 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
21740 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
21750 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
21760 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
21770 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
21780 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
21790 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
217a0 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
217b0 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
217c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
217d0 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
217e0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
217f0 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
21800 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b  m.szMalloc!=0 );
21810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21820 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
21830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21840 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
21850 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
21860 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
21870 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
21880 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
21890 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
218a0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
218b0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
218c0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
218d0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
218e0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
218f0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
21900 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
21910 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
21920 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
21930 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
21940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21950 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
21960 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
21970 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
21980 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
21990 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
219a0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
219b0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
219c0 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
219d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
219e0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
219f0 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
21a00 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
21a10 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
21a20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
21a30 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
21a40 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
21a50 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
21a60 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
21a70 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
21a80 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
21a90 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
21aa0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
21ad0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
21ae0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
21af0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
21b00 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
21b10 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
21b20 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
21b30 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55  cked,       /* U
21b40 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
21b50 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  of key */.  int 
21b60 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b80 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
21b90 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
21ba0 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
21bb0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
21bc0 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
21bd0 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  *pCur;.  Mem m;.
21be0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
21bf0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
21c00 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72  _BTREE );.  pCur
21c10 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
21c20 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  r;.  assert( sql
21c30 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21c40 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
21c50 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
21c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
21c70 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
21c80 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
21c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21ca0 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
21cb0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
21cc0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
21cd0 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
21ce0 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
21cf0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
21d00 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
21d10 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a  ause of the way.
21d20 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
21d30 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
21d40 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
21d50 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
21d60 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
21d70 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
21d80 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
21d90 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
21da0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
21db0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21dc0 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
21dd0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
21de0 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
21df0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
21e00 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
21e10 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
21e20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
21e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
21e40 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
21e50 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21e60 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
21e70 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
21e80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
21e90 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
21ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
21ec0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
21ed0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
21ee0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
21ef0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
21f00 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
21f10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21f20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
21f30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
21f40 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
21f50 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
21f60 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
21f70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21f80 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
21f90 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
21fa0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
21fb0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
21fc0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
21fd0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
21fe0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
21ff0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
22000 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
22010 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
22020 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
22030 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
22040 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
22050 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
22060 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
22070 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
22080 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
22090 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
220a0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
220b0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
220c0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
220d0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
220e0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
220f0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
22100 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
22110 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
22120 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
22130 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
22140 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
22150 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
22160 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
22170 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
22180 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
22190 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
221a0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
221b0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
221c0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
221d0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
221e0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
221f0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22200 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
22210 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
22220 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
22230 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
22240 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
22250 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
22260 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
22270 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
22280 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
22290 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
222a0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
222b0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
222c0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
222d0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
222e0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
222f0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
22300 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22310 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
22320 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
22330 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
22340 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
22350 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
22360 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
22370 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
22380 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
22390 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
223a0 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
223b0 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
223c0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
223d0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
223e0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
223f0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
22400 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
22410 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
22420 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
22430 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
22440 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
22450 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
22460 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
22470 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
22480 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
22490 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
224a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
224b0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
224c0 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
224d0 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
224e0 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
224f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
22500 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
22510 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
22520 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
22530 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
22540 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
22550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22560 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
22570 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
22580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22590 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
225a0 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
225b0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
225c0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
225d0 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
225e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
225f0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
22600 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
22610 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
22620 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
22630 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
22640 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
22650 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
22660 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
22670 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
22680 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
22690 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
226a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
226b0 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
226c0 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
226d0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
226e0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
226f0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
22700 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
22710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
22720 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
22730 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
22740 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
22750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22760 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
22770 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
22780 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
22790 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
227a0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
227b0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
227c0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
227d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
227e0 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
227f0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
22800 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
22810 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
22820 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
22830 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
22840 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
22850 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
22860 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
22870 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
22880 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
22890 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
228a0 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
228b0 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
228c0 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
228d0 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
228e0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
228f0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
22900 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
22910 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22920 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
22930 42 4c 45 20 2a 2f 0a                             BLE */.