/ Hex Artifact Content
Login

Artifact 787f5f9d58f4c6f39294ed06909ba602d1a402e6:


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 28 70 20 26 26 20 70    return (p && p
0740: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 29 20 3f  ->isPrepareV2) ?
0750: 20 70 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a   p->zSql : 0;.}.
0760: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0770: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0780: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
0790: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
07a0: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
07b0: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07c0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07d0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07e0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
07f0: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
0800: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0820: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0830: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0840: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0850: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0860: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0870: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0880: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
0890: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
08a0: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
08b0: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08c0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08d0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08e0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
08f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68  ./*.** Resize th
0900: 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79  e Vdbe.aOp array
0910: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
0920: 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d  t least nOp elem
0930: 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20  ents larger .** 
0940: 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74  than its current
0950: 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75   size. nOp is gu
0960: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
0970: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
0980: 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a  l.** to 1024/siz
0990: 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49  eof(Op)..**.** I
09a0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
09b0: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
09c0: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
09d0: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
09e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
09f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0a00: 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73  dbe.aOp and Pars
0a10: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69  e.nOpAlloc remai
0a20: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  n .** unchanged 
0a30: 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74  (this is so that
0a40: 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72   any opcodes alr
0a50: 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63  eady allocated c
0a60: 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63  an be .** correc
0a70: 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  tly deallocated 
0a80: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
0a90: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ab0: 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65  growOpArray(Vdbe
0ac0: 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20   *v, int nOp){. 
0ad0: 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20   VdbeOp *pNew;. 
0ae0: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
0af0: 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65  Parse;..  /* The
0b00: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b10: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70  LLOC_STRESS comp
0b20: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
0b30: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66  is designed to f
0b40: 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66  orce.  ** more f
0b50: 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73  requent reallocs
0b60: 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69   and hence provi
0b70: 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  de more opportun
0b80: 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20  ities for .  ** 
0b90: 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61  simulated OOM fa
0ba0: 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45  ults.  SQLITE_TE
0bb0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0bc0: 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75  S is generally u
0bd0: 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  sed.  ** during 
0be0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57  testing only.  W
0bf0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  ith SQLITE_TEST_
0c00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67  REALLOC_STRESS g
0c10: 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79  row the op array
0c20: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e  .  ** by the min
0c30: 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71  imum* amount req
0c40: 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  uired until the 
0c50: 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32  size reaches 512
0c60: 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f  .  Normal.  ** o
0c70: 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75  peration (withou
0c80: 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  t SQLITE_TEST_RE
0c90: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73  ALLOC_STRESS) is
0ca0: 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63   to double the c
0cb0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65  urrent.  ** size
0cc0: 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79   of the op array
0cd0: 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73   or add 1KB of s
0ce0: 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20  pace, whichever 
0cf0: 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23  is smaller. */.#
0d00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0d10: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0d20: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0d30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20  ->nOpAlloc>=512 
0d40: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d50: 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f  : p->nOpAlloc+nO
0d60: 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  p);.#else.  int 
0d70: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
0d80: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
0d90: 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34  c*2 : (int)(1024
0da0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20  /sizeof(Op)));. 
0db0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
0dc0: 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  R(nOp);.#endif..
0dd0: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28    assert( nOp<=(
0de0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0df0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
0e00: 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  ew>=(p->nOpAlloc
0e10: 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20  +nOp) );.  pNew 
0e20: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0e30: 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70  oc(p->db, v->aOp
0e40: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0e50: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0e60: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0e70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e80: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e90: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0ea0: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0eb0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ec0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0ed0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ee0: 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  M);.}..#ifdef SQ
0ef0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
0f10: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
0f20: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0f30: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0f40: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
0f50: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
0f60: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
0f70: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
0f80: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
0f90: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
0fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0fb0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
0fc0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
0fd0: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
0fe0: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
0ff0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1000: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1010: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1020: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1030: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1040: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
1050: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
1060: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1070: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
1080: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
1090: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
10a0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
10b0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
10c0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
10d0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
10e0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
10f0: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1100: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1110: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1120: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1130: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1140: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
1150: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
1160: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
1170: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
1180: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
1190: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
11a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
11b0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
11c0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
11d0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
11e0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
11f0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
1200: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1210: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1220: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1230: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
1240: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
1250: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1260: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
1270: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1280: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   1) ){.      ret
1290: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12a0: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
12b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
12c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
12d0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
12e0: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
12f0: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
1300: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
1310: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
1320: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
1330: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
1340: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
1350: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
1360: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70  N_COMMENTS.  pOp
1370: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1380: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1390: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
13a0: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
13b0: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
13c0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
13d0: 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72   jj, kk;.    Par
13e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28  pParse;.    for(
1400: 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49  jj=kk=0; jj<SQLI
1410: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a  TE_N_COLCACHE; j
1420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1430: 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20  ct yColCache *x 
1440: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1450: 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20  che + jj;.      
1460: 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50  if( x->iLevel>pP
1470: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1480: 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20  l || x->iReg==0 
1490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14a0: 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d    printf(" r[%d]
14b0: 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52  ={%d:%d}", x->iR
14c0: 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78  eg, x->iTable, x
14d0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14e0: 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20    kk++;.    }.  
14f0: 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74    if( kk ) print
1500: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  f("\n");.    sql
1510: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
1520: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
1530: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
1540: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1550: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1560: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1570: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1580: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1590: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15a0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
15b0: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
15c0: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
15d0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
15e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15f0: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
1600: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
1610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1620: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
1630: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1640: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1650: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1660: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1680: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1690: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
16a0: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
16b0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
16c0: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
16d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
16f0: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1700: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1710: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1720: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1730: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1740: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1750: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1770: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1780: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1790: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
17a0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
17b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17d0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
17e0: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1800: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1810: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1820: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1830: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1840: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1850: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1860: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1870: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
1880: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
1890: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
18a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
18c0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
18d0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
18e0: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
18f0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1900: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1910: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1920: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1930: 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36  e with a P4_INT6
1940: 34 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  4 type..*/.int s
1950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1960: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1980: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1990: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
19a0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
19b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
19c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
19f0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1a10: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1a20: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1a30: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1a40: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1a50: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1a60: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1a70: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1a90: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1aa0: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
1ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ac0: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
1ad0: 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(p), 8);.  if
1ae0: 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70  ( p4copy ) memcp
1af0: 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38  y(p4copy, zP4, 8
1b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1b20: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c   op, p1, p2, p3,
1b30: 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29   p4copy, p4type)
1b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1b50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
1b60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
1b70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
1b80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
1b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
1ba0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
1bb0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
1bc0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
1bd0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
1be0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
1bf0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
1c00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
1c50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
1c60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
1c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1c80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1c90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1ca0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
1cb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  {.  int j;.  int
1cc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1cd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
1ce0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
1cf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1d00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1d10: 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20  , addr, zWhere, 
1d20: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
1d30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
1d40: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
1d50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1d60: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
1d70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1d80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1d90: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
1da0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dc0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1de0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1df0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1e00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1e10: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1e20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1e50: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e80: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1e90: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1ea0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
1ed0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1ee0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f00: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1f10: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1f20: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1f30: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
1f40: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
1f50: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
1f60: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1f70: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1f80: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1f90: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1fa0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1fb0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1fc0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1fd0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1fe0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1ff0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
2000: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
2010: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2020: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2030: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2040: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2050: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2060: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2070: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2080: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2090: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
20a0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
20b0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
20c0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
20d0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
20e0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
20f0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
2100: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
2110: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2120: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2130: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2140: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2150: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2160: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2170: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2180: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2190: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
21a0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
21c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
21d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
21e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
2200: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
2210: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2220: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2230: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2240: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2250: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2260: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2270: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2280: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2290: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
22a0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
22e0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
22f0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2300: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2310: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2330: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
2340: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2350: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2360: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2370: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2380: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2390: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
23a0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
23b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
23c0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23e0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
23f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2400: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2410: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2420: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2430: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
2440: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2450: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2460: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2470: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2480: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6a 3e  .  if( ALWAYS(j>
2490: 3d 30 29 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  =0) && p->aLabel
24a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
24b0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
24c0: 20 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70   }.  p->iFixedOp
24d0: 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d   = v->nOp - 1;.}
24e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
24f0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2500: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2510: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2520: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2530: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2540: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2550: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2570: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
2580: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
2590: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
25a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
25b0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
25c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
25d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
25e0: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
25f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
2600: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
2610: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
2620: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
2630: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2640: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2650: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2660: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2670: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2680: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2690: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
26a0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
26b0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
26c0: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
26d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
26f0: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
2700: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
2710: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2720: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
2730: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2740: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2750: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2760: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2770: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2780: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2790: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
27a0: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
27b0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
27c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27e0: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
27f0: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
2800: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
2810: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
2820: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2830: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2840: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2860: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2870: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2880: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28a0: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
28b0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
28c0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
28d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
28e0: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
28f0: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
2900: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
2910: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
2920: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
2930: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2940: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2950: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2960: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2970: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2980: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2990: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
29a0: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
29b0: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
29c0: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
29d0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
29e0: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
29f0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
2a00: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2a10: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2a20: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
2a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2a40: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
2a50: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
2a60: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
2a70: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
2a80: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2a90: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2aa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2ac0: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2ad0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
2ae0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
2af0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
2b00: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
2b10: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
2b20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
2b30: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
2b40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2b50: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
2b60: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2b70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2b90: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2ba0: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2bb0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2bc0: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2bd0: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
2be0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
2bf0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2c00: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c20: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
2c30: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
2c40: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
2c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2c70: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
2c80: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2c90: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2ca0: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2cb0: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2cc0: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2cd0: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
2ce0: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
2cf0: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
2d00: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2d10: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2d20: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
2d30: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2d40: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
2d50: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
2d60: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
2d70: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
2d80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2d90: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2da0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2db0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2dc0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2dd0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2de0: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2df0: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2e00: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2e10: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2e20: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
2e30: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2e40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
2e50: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
2e60: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2e70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2e80: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
2e90: 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f  reateTable and O
2ea0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
2eb0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
2ec0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
2ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2ee0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2ef0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2f00: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2f10: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
2f20: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
2f30: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
2f40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2f50: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2f60: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2f70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f80: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2f90: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2fa0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2fb0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2fc0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2fd0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2fe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2ff0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3000: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
3010: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
3020: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
3030: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3040: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
3050: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
3060: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
3070: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
3080: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
3090: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
30a0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
30b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
30c0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
30d0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
30e0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
30f0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
3100: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
3110: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
3120: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3130: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
3140: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
3150: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
3160: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
3170: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
3180: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
3190: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
31a0: 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f   .     || ((opco
31b0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
31c0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
31d0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
31e0: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
31f0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3200: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
3210: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
3220: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
3230: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
3240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3250: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
3260: 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61  eTable ) hasCrea
3270: 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  teTable = 1;.   
3280: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3290: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
32a0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
32b0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
32c0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
32d0: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
32e0: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
32f0: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
3300: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
3310: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
3320: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
3330: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
3340: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
3350: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
3360: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
3370: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
3380: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
3390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
33a0: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
33b0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
33c0: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
33d0: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
33e0: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
33f0: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
3400: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
3410: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
3420: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
3430: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
3440: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
3450: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
3460: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
3470: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
3480: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
3490: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
34a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
34b0: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
34c0: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
34d0: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
34e0: 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72         || (hasCr
34f0: 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73  eateTable && has
3500: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29  InitCoroutine) )
3510: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3520: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
3530: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
3540: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
3550: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
3560: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
3570: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
3580: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
3590: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
35a0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
35b0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
35c0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
35d0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
35e0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
35f0: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
3600: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
3610: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
3620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
3640: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
3650: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3660: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
3670: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
3680: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
3690: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
36a0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
36b0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
36c0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
36d0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
36e0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
36f0: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
3700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
3710: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
3720: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
3730: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
3740: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
3750: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
3760: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
3770: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3780: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3790: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
37a0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
37b0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
37c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
37d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
37e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
37f0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3800: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3810: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3820: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3830: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3840: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3850: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3860: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3870: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3880: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3890: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
38a0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
38b0: 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64  odeh.awk when ad
38c0: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
38d0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
38e0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
38f0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3900: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3910: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3920: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3930: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3940: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3950: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3960: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3970: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3980: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3990: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
39a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
39b0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
39c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
39d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
39f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3a00: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3a10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3a20: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3a30: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3a40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3a50: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3a60: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3a80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3aa0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3ab0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
3ac0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
3ad0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
3ae0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3af0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3b10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3b20: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3b30: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3b40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3b50: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3b60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3b70: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3b80: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
3b90: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
3ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
3bb0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3bc0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3be0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3bf0: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3c00: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3c10: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3c20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3c30: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3c40: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3c50: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3c60: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c70: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3c90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ca0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
3cb0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
3cc0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
3cd0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3ce0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3cf0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3d00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d10: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3d30: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3d40: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3d50: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3d60: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3d70: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3d80: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3d90: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
3da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
3db0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
3dc0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3dd0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3de0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3df0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e00: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3e10: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3e20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3e30: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3e40: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3e50: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3e60: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3e70: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3e80: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3e90: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ea0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3eb0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ec0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ed0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3ee0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3ef0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3f00: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3f10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f30: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3f40: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f60: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3f70: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3f80: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3f90: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3fa0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3fb0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3fc0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3fd0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3fe0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3ff0: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4000: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4010: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4020: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4030: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4040: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4050: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4060: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4070: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4080: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4090: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
40a0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
40b0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
40c0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
40d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
40e0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
40f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4100: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4110: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4120: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4130: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4140: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4150: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4160: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4170: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4180: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4190: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
41b0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
41c0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
41d0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
41e0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
41f0: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4200: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4210: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4220: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4230: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4240: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4250: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4260: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4270: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4280: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4290: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
42a0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
42b0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
42c0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
42d0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
42e0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
42f0: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
4300: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
4310: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
4320: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
4330: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
4340: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
4350: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
4360: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4370: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4380: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
4390: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
43a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
43b0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
43c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
43d0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
43e0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
43f0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4400: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4410: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4420: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4440: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4450: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4460: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4470: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4480: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
4490: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
44a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
44b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
44c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
44d0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
44e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
44f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4500: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4510: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4520: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4530: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4550: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4560: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4570: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4580: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
4590: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
45a0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
45b0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
45c0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
45d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
45e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
45f0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4600: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4610: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4620: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4630: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4640: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4650: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4660: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4670: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4680: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4690: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
46a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
46b0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46d0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
46e0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
46f0: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4710: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4720: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4730: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4750: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4760: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4770: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4780: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
4790: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
47a0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
47b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
47c0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
47d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4800: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4810: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4820: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4830: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4840: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4850: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4860: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4880: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
4890: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
48a0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
48b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
48c0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
48d0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
48e0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4910: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4920: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4930: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4950: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4960: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4970: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4980: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
4990: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
49a0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
49b0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
49c0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
49d0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
49e0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
49f0: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4a00: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4a10: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4a20: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4a30: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4a40: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4a50: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4a60: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4a70: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4a80: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
4a90: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
4aa0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
4ab0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
4ac0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4ad0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
4ae0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4af0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4b00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4b10: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4b20: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4b30: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4b40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4b50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b60: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4b70: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4b80: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
4b90: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
4ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bb0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
4bc0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
4bd0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
4be0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4c00: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4c10: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4c20: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4c30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4c40: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4c50: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4c60: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4c70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4c80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4c90: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4ca0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4cb0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4cc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cd0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
4ce0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4cf0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4d00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4d10: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4d20: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4d30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4d40: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4d50: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4d60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4d70: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4d90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4da0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
4db0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4de0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4df0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4e00: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4e10: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4e20: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4e30: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4e40: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4e50: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4e60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4e70: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4e80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4e90: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ea0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4eb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ec0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4ee0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4f00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4f10: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4f20: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4f30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4f40: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4f50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4f60: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4f70: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4f80: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4f90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4fa0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4fc0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4fd0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4fe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4ff0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
5000: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
5010: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
5020: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
5030: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5040: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5050: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5060: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5070: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5080: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5090: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
50b0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
50c0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
50d0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
50e0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
50f0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
5100: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5110: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
5120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5130: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5140: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5150: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5160: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5170: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5180: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5190: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51b0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
51c0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
51d0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
51e0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
51f0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
5200: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5210: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
5220: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5230: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5240: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5250: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5260: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5270: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5280: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5290: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
52a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
52b0: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
52c0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
52d0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
52e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
52f0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
5300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5310: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
5320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5330: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5340: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5350: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5360: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5370: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5380: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
53a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
53b0: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
53c0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
53d0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
53e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
53f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5410: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5420: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5430: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5440: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
5450: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5460: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5470: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5480: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5490: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
54a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
54b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
54c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
54f0: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5500: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5510: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5530: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5540: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5550: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5560: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5570: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5580: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5590: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
55a0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
55b0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
55c0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
55d0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
55e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
55f0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5600: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5610: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5620: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5630: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5640: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5650: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5660: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5670: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5680: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5690: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
56a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
56b0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
56c0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
56d0: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
56e0: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
56f0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5700: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5710: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5720: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
5730: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5740: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
5750: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5760: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5780: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
5790: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
57a0: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
57b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
57c0: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
57d0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
57e0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
57f0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5800: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
5810: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
5820: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
5830: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
5840: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
5850: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
5860: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
5870: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
5880: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
5890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
58a0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
58b0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
58c0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
58d0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
58e0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
58f0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
5900: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
5910: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
5920: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
5930: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
5940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
5950: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
5960: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61  t addr){.  if( a
5970: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ddr<p->nOp ){.  
5980: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
5990: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
59a0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
59b0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65   p->db;.    free
59c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
59d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
59e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
59f0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
5a00: 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ));.    pOp->opc
5a10: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
5a20: 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e     if( addr==p->
5a30: 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d  nOp-1 ) p->nOp--
5a40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5a50: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
5a60: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
5a70: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
5a80: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
5a90: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
5aa0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
5ab0: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
5ac0: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
5ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5ae0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5af0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5b00: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5b10: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5b20: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5b30: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5b40: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5b60: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5b70: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
5b80: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5ba0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
5bb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5bc0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5bd0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5be0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5bf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c00: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5c10: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5c20: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5c30: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c50: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5c60: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5c70: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
5c80: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
5c90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
5ca0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
5cb0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
5cc0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5cd0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5ce0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5cf0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5d00: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5d10: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5d20: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5d30: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5d40: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5d50: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5d60: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5d70: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
5d80: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
5d90: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
5da0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
5db0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
5dc0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5dd0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5de0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5df0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5e00: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5e10: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5e20: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5e30: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5e40: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5e50: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5e60: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5e70: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
5e80: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
5e90: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5ea0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
5eb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5ec0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5ed0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5ee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5ef0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5f00: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5f10: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5f20: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5f30: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5f40: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f50: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f60: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5f70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f80: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
5f90: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
5fa0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
5fb0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
5fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5fd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5fe0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5ff0: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
6000: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
6010: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
6020: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
6030: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
6040: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
6050: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
6060: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
6070: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6080: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
6090: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
60a0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
60b0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
60c0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
60d0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
60e0: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
60f0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6100: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6110: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
6120: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
6130: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
6140: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
6150: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
6160: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
6170: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6180: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6190: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
61a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
61b0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
61c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
61d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
61e0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
61f0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
6200: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6210: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
6220: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
6230: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
6240: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
6250: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
6260: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
6270: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
6280: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
6290: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
62a0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
62b0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
62c0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
62d0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
62e0: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
62f0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6300: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
6310: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
6320: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
6330: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
6340: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
6350: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
6360: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6370: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6380: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
6390: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
63a0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
63b0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
63c0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
63d0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
63e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
63f0: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
6400: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
6410: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
6420: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6430: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
6440: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
6450: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
6460: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
6470: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6480: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6490: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
64a0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
64b0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
64c0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
64d0: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
64e0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
6510: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6520: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
6530: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
6540: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
6550: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
6560: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
6570: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
6580: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
6590: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
65a0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
65b0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
65c0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
65d0: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
65e0: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
65f0: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
6600: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
6610: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
6620: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
6630: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
6640: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6650: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6660: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
6670: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6680: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
6690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
66a0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
66b0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
66c0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
66d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
66e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
66f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6700: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
6710: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
6720: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6730: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
6740: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6750: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
6760: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
6770: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6780: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6790: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
67a0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
67b0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
67c0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
67d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
67e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
67f0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
6800: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
6810: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
6820: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
6830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
6840: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
6850: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6860: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6870: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
6880: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
6890: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
68a0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
68b0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
68c0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
68d0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
68e0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
68f0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
6900: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
6910: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6920: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
6930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
6940: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
6950: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
6960: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
6970: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
6980: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6990: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
69a0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
69b0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
69c0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
69d0: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
69e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
69f0: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
6a00: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
6a10: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
6a20: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
6a30: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
6a40: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
6a50: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
6a60: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
6a70: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
6a80: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
6a90: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6aa0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
6ab0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
6ac0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
6ad0: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
6ae0: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
6af0: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
6b00: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
6b10: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
6b20: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
6b30: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
6b40: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
6b50: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
6b60: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
6b70: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
6b80: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
6b90: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
6ba0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e  ning.** after an
6bb0: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
6bc0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
6bd0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6be0: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
6bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6c00: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
6c10: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
6c20: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
6c30: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
6c40: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
6c50: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
6c60: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
6c70: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
6c80: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
6c90: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
6ca0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6cb0: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
6cc0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6cd0: 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65   /* C89 specifie
6ce0: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  s that the const
6cf0: 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c  ant "dummy" will
6d00: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6d10: 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f  to all.  ** zero
6d20: 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72  s, which is corr
6d30: 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72  ect.  MSVC gener
6d40: 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20  ates a warning, 
6d50: 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f  nevertheless. */
6d60: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
6d70: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
6d80: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
6d90: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
6da0: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
6db0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6dc0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6dd0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6de0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6df0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6e00: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6e10: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6e20: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6e30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6e40: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6e50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6e60: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6e70: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6e80: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6e90: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
6ea0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6eb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6ec0: 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  COMMENTS)./*.** 
6ed0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
6ee0: 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20  r value for one 
6ef0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6f00: 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20  s to the opcode 
6f10: 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  pOp.** determine
6f20: 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63  d by character c
6f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6f40: 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20  translateP(char 
6f50: 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  c, const Op *pOp
6f60: 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20  ){.  if( c=='1' 
6f70: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31  ) return pOp->p1
6f80: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29  ;.  if( c=='2' )
6f90: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b   return pOp->p2;
6fa0: 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20  .  if( c=='3' ) 
6fb0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a  return pOp->p3;.
6fc0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72    if( c=='4' ) r
6fd0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b  eturn pOp->p4.i;
6fe0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
6ff0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  5;.}../*.** Comp
7000: 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ute a string for
7010: 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66   the "comment" f
7020: 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f  ield of a VDBE o
7030: 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a  pcode listing..*
7040: 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69  *.** The Synopsi
7050: 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d  s: field in comm
7060: 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65  ents in the vdbe
7070: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67  .c source file g
7080: 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  ets converted.**
7090: 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72   to an extra str
70a0: 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65  ing that is appe
70b0: 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  nded to the sqli
70c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e  te3OpcodeName().
70d0: 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65    In the.** abse
70e0: 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d  nce of other com
70f0: 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f  ments, this syno
7100: 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  psis becomes the
7110: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
7120: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20  opcode..** Some 
7130: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75  translation occu
7140: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rs:.**.**       
7150: 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72  "PX"      ->  "r
7160: 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50  [X]".**       "P
7170: 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58  X@PY"   ->  "r[X
7180: 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72  ..X+Y-1]"  or "r
7190: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f  [x]" if y is 0 o
71a0: 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  r 1.**       "PX
71b0: 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e  @PY+1" ->  "r[X.
71c0: 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b  .X+Y]"    or "r[
71d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a  x]" if y is 0.**
71e0: 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20         "PY..PY" 
71f0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20   ->  "r[X..Y]"  
7200: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7210: 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20   y<=x.*/.static 
7220: 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  int displayComme
7230: 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a  nt(.  const Op *
7240: 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pOp,     /* The 
7250: 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d  opcode to be com
7260: 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  mented */.  cons
7270: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f  t char *zP4,   /
7280: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  * Previously obt
7290: 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20  ained value for 
72a0: 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  P4 */.  char *zT
72b0: 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  emp,       /* Wr
72c0: 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ite result here 
72d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20  */.  int nTemp  
72e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
72f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54   available in zT
7300: 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f  emp[] */.){.  co
7310: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
7320: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
7330: 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e  *zSynopsis;.  in
7340: 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nOpName;.  int
7350: 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61   ii, jj;.  zOpNa
7360: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
7370: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7380: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
7390: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
73a0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
73b0: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
73c0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
73d0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
73e0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
73f0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
7400: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
7410: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
7420: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
7430: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
7440: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
7450: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
7460: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
7470: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
7480: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
7490: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
74a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74b0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
74c0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
74d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
74e0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
74f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7500: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7510: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
7520: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7530: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
7540: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
7550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7560: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
7570: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
7580: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
7590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
75a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
75b0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
75c0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
75d0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
75e0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
75f0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
7600: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
7610: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
7620: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
7630: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
7640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
7650: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
7660: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
7670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7680: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7690: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
76b0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
76d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
76f0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
7700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7720: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
7730: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
7740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7750: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7760: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7770: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
7780: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
7790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
77a0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
77b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
77c0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
77d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
77e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
77f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7800: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
7810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7820: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
7830: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
7840: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
7850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7860: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7870: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
7880: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
7890: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
78a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
78b0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
78c0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
78d0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
78e0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
78f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7900: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7910: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7920: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
7930: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
7940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7950: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
7960: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
7970: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
7980: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
7990: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
79a0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a  LITE_DEBUG */...
79b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
79c0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
79d0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
79e0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
79f0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7a00: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7a10: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7a20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7a30: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
7a40: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
7a50: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
7a60: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
7a70: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
7a80: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
7a90: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
7aa0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
7ab0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
7ac0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
7ad0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
7ae0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
7af0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
7b00: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
7b10: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
7b20: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
7b30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
7b40: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
7b50: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
7b60: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
7b70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
7b80: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
7b90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
7ba0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7bb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
7bc0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
7bd0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
7be0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7bf0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
7c00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
7c10: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
7c30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
7c40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
7c50: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7c60: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
7c70: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
7c80: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
7c90: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
7ca0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
7cb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
7cc0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
7cd0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
7ce0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
7cf0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
7d00: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
7d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7d20: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
7d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7d40: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
7d50: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
7d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7d70: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
7d80: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
7d90: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
7da0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
7db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7dc0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
7dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7de0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
7df0: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
7e00: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
7e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7e20: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
7e30: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
7e40: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
7e50: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
7e60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
7e80: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
7e90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
7ea0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7ec0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7ed0: 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  p, "(%.20s)", pC
7ee0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
7ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f00: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7f10: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
7f20: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7f30: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
7f40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f60: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
7f70: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
7f80: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
7f90: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
7fa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7fb0: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
7fc0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
7fd0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
7fe0: 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20  .pCtx->pFunc;.  
7ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8000: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8010: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
8020: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
8030: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
8040: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8050: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
8060: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
8070: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8080: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
8090: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
80a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
80b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
80c0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
80d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
80e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
80f0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
8100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8110: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8120: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
8130: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8140: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
8150: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
8160: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8180: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
8190: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
81a0: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
81b0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
81c0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
81d0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
81e0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
81f0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
8200: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
8210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8220: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8230: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
8240: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
8250: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
8260: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
8270: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
8280: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8290: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
82a0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
82b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
82c0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
82d0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
82e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8300: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
8310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8320: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
8330: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
8340: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
8350: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
8360: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
8380: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8390: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
83a0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
83b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
83c0: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
83d0: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
83e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
83f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8400: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
8410: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
8420: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8430: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
8440: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
8450: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8460: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
8470: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
8480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8490: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
84a0: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
84b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
84c0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
84d0: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
84e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
84f0: 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b  se P4_ADVANCE: {
8500: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
8510: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
8520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
8530: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
8540: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
8550: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
8560: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
8570: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
8580: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
8590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
85a0: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
85b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
85c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
85d0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
85e0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
85f0: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
8600: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
8620: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
8630: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
8640: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
8650: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
8660: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
8670: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
8680: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
8690: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
86a0: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
86b0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
86c0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
86d0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
86e0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
86f0: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
8700: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
8710: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
8720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8730: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
8740: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
8750: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
8760: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
8770: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
8780: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
8790: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
87a0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
87b0: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
87c0: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
87d0: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
87e0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
87f0: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
8800: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
8810: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
8820: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
8830: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
8840: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
8850: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
8860: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
8870: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
8880: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
8890: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
88a0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
88b0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
88c0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
88d0: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
88e0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
88f0: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
8900: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
8910: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
8920: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
8930: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
8940: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
8950: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
8960: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
8970: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
8980: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
8990: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
89a0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
89b0: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
89c0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
89d0: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
89e0: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
89f0: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
8a00: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
8a10: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
8a20: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
8a30: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
8a40: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
8a50: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
8a60: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
8a70: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
8a80: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
8a90: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
8aa0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
8ab0: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
8ac0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
8ad0: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
8ae0: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
8af0: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
8b00: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
8b10: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
8b20: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
8b30: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
8b40: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
8b50: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
8b60: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
8b70: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
8b80: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
8b90: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
8ba0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
8bb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
8bc0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
8bd0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
8be0: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
8bf0: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
8c00: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
8c10: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
8c20: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
8c30: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
8c40: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
8c50: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
8c60: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
8c70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8c80: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
8c90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8ca0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8cb0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8cc0: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
8cd0: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
8ce0: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
8cf0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
8d00: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
8d10: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
8d20: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
8d30: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
8d40: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
8d50: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
8d60: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
8d70: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
8d80: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
8d90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8da0: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
8db0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
8dc0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
8dd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8de0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
8df0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
8e00: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
8e10: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
8e20: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
8e30: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
8e40: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
8e50: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
8e60: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8e70: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
8e80: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
8e90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8ea0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
8eb0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
8ec0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
8ed0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
8ee0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
8ef0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
8f00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
8f10: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
8f20: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
8f30: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
8f40: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
8f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
8f60: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
8f70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
8f80: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
8f90: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
8fa0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
8fb0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
8fc0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
8fd0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
8fe0: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
8ff0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
9000: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
9010: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
9020: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
9030: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
9040: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
9050: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
9060: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
9070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9080: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
9090: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
90a0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
90b0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
90c0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
90d0: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
90e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
90f0: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
9100: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
9110: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
9120: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
9130: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
9140: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
9150: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
9160: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
9170: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
9180: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
9190: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
91a0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
91b0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
91c0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
91d0: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
91e0: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
91f0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
9200: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
9210: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
9220: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
9230: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
9240: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
9250: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
9260: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
9270: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
9280: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
9290: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
92a0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
92b0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
92d0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
92e0: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
92f0: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
9300: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
9310: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
9320: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
9330: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
9340: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
9350: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
9360: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
9370: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9380: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
9390: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
93a0: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
93b0: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
93c0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
93d0: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
93e0: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
93f0: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66  ocFailed;.    if
9400: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
9410: 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ed ){.      do{.
9420: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
9430: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
9440: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
9450: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
9460: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
9470: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
9480: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  n;.    }.    do{
9490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
94a0: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
94b0: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
94c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
94d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
94e0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
94f0: 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p) );..      /* 
9500: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
9510: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
9520: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
9530: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
9540: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
9550: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
9560: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
9570: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
9580: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
9590: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
95a0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
95b0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
95c0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
95d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
95e0: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
95f0: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
9600: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
9610: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
9620: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
9630: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
9640: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
9650: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
9660: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
9670: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
9680: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
9690: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
96a0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
96b0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
96c0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
96d0: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
96e0: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
96f0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
9700: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
9710: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
9720: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
9730: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
9740: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
9750: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
9760: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
9770: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
9780: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
9790: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
97a0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
97b0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
97c0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
97d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
97e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67  ->flags & MEM_Ag
97f0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
9800: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
9810: 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20  MEM_Dyn );.     
9820: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
9830: 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20  ags & MEM_Frame 
9840: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9850: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
9860: 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20  M_RowSet );.    
9870: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
9880: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
9890: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
98a0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
98b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
98c0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
98d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a   }else if( p->sz
98e0: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
98f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9900: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
9910: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
9920: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
9930: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
9940: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
9950: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
9960: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
9970: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9980: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
9990: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
99a0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
99b0: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
99c0: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
99d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
99e0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
99f0: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
9a00: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
9a10: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
9a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9a30: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
9a40: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
9a50: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
9a60: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
9a70: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
9a80: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
9a90: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
9aa0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
9ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9ac0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
9ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
9ae0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
9af0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
9b00: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9b10: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
9b20: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
9b30: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
9b40: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
9b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9b60: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
9b70: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
9b80: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
9b90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
9ba0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
9bb0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
9bc0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
9bd0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
9be0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
9bf0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
9c00: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
9c10: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
9c20: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
9c30: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
9c40: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
9c50: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
9c60: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
9c70: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
9c80: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
9c90: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
9ca0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
9cb0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
9cc0: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
9cd0: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
9ce0: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
9cf0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
9d00: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
9d10: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
9d20: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
9d30: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
9d40: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
9d50: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
9d60: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
9d70: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
9d80: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
9d90: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
9da0: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
9db0: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
9dc0: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
9dd0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
9de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9df0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
9e00: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
9e30: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
9e40: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
9e50: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
9e80: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
9e90: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
9ea0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
9eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9ec0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
9ed0: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
9ee0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f00: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
9f10: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
9f20: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
9f30: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f50: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
9f60: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
9f70: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9fa0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
9fb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9fd0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9fe0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
9ff0: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
a000: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a010: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
a020: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a030: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
a040: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
a050: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
a060: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
a070: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
a080: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
a090: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
a0a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
a0b0: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
a0c0: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
a0d0: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
a0e0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
a0f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
a100: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
a110: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
a120: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
a130: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
a140: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
a150: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
a160: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
a170: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
a180: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
a190: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
a1a0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
a1b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
a1c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
a1d0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
a1e0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
a1f0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
a200: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
a210: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
a220: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
a230: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
a240: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
a250: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
a260: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a270: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
a280: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
a290: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
a2a0: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
a2b0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
a2c0: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
a2d0: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
a2e0: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
a2f0: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
a300: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
a310: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
a320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
a330: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
a340: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
a350: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
a360: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
a370: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
a380: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
a390: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
a3a0: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
a3b0: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
a3c0: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
a3d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
a3e0: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
a3f0: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
a400: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
a410: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
a420: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
a430: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
a440: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
a450: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
a460: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
a470: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
a480: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
a490: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
a4a0: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
a4b0: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
a4c0: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
a4d0: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
a4e0: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
a4f0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
a500: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
a510: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
a520: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
a530: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
a540: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
a550: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
a560: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
a570: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
a580: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
a590: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
a5a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a5b0: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
a5c0: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
a5d0: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
a5e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
a5f0: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
a600: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
a610: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
a620: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
a630: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
a640: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
a650: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a660: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a670: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
a680: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
a690: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
a6a0: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
a6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
a6c0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
a6d0: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
a6e0: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
a6f0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
a700: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
a710: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
a720: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
a730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
a750: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
a760: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
a770: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
a780: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
a790: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
a7a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
a7b0: 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
a7c0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
a7d0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
a7e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34  e{.    char *zP4
a7f0: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
a800: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
a810: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
a820: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
a830: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
a840: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
a850: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
a860: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
a870: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
a880: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
a890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a8a0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
a8b0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
a8c0: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
a8d0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
a8e0: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
a8f0: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
a900: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
a910: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a920: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
a930: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
a940: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
a950: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
a960: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
a970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a980: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
a990: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aOp[i];.    }.  
a9a0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
a9b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
a9c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a9d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
a9e0: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
aa10: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
aa20: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
aa30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
aa40: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
aa50: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
aa60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
aa70: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
aa80: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
aa90: 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65  code); /* Opcode
aaa0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
aab0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
aac0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
aad0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
aae0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
aaf0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
ab00: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
ab10: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
ab20: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
ab30: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
ab40: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
ab50: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
ab60: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
ab70: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
ab80: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
ab90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
aba0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
abb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
abc0: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
abd0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
abe0: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
abf0: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
ac00: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
ac10: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
ac20: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
ac30: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
ac40: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
ac50: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
ac60: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
ac70: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
ac80: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
ac90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
aca0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
acb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
acc0: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
acd0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
ace0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
acf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
ad00: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
ad10: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
ad20: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
ad30: 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29  Byte, nSub!=0) )
ad40: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
ad50: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
ad60: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
ad70: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
ad80: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
ad90: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
ada0: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
adb0: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
adc0: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
add0: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
ade0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
adf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ae00: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
ae10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
ae20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
ae30: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae50: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
ae60: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
ae70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
ae80: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ae90: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
aec0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
aed0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
aee0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
aef0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
af20: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
af30: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
af40: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
af50: 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f 2a 20  pMem, 32) ){ /* 
af60: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
af70: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
af80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
af90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
afa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
afb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
afc0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
afd0: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
afe0: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
aff0: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
b000: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
b010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b020: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
b030: 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zP4, -1, SQLITE_
b040: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
b050: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
b060: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
b070: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
b080: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b090: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
b0a0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
b0b0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
b0c0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b0d0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
b0e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
b0f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
b100: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
b110: 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  m, 4) ){.       
b120: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
b130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b140: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b150: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b160: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
b170: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
b180: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
b190: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
b1a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
b1b0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
b1c0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
b1d0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
b1e0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
b1f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
b200: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
b210: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b220: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
b230: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
b240: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
b250: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
b260: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
b270: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
b280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b290: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b2a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b2b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
b2c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
b2d0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
b2e0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
b2f0: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
b300: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
b310: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
b320: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
b330: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d  ;.#else.      pM
b340: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b350: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
b360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b370: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
b380: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
b390: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
b3a0: 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  4*(p->explain-1)
b3b0: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74  ;.    p->pResult
b3c0: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
b3d0: 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ];.    p->rc = S
b3e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
b3f0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
b400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b410: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b420: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
b430: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b440: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
b450: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
b460: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
b470: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
b480: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
b490: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
b4a0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
b4b0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
b4c0: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
b4d0: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
b4e0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
b4f0: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
b500: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
b510: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
b520: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
b530: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
b540: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
b550: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
b560: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
b570: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
b580: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
b590: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
b5a0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
b5b0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
b5c0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
b5e0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
b5f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
b600: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
b610: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
b620: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
b630: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
b640: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
b650: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
b660: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
b670: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
b680: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
b690: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
b6a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
b6b0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
b6c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
b6d0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
b6e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
b6f0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
b700: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
b710: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
b720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
b730: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
b740: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
b750: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
b760: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
b770: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
b780: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
b790: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
b7a0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
b7b0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
b7c0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
b7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
b7e0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
b800: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
b810: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
b820: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
b830: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
b840: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
b850: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
b860: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
b870: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
b880: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
b890: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
b8a0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
b8b0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
b8c0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
b8d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
b8e0: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
b8f0: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
b900: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
b910: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
b920: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
b930: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
b940: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
b950: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
b960: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
b970: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
b980: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
b990: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
b9a0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
b9b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b9c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
b9d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b9e0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
b9f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
ba00: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
ba10: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
ba20: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
ba30: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
ba40: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
ba50: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
ba60: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
ba70: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
ba80: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
ba90: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
baa0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
bab0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
bac0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
bad0: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
bae0: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
baf0: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
bb00: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
bb10: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
bb20: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
bb30: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
bb40: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
bb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bb60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
bb70: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
bb80: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
bb90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
bba0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
bbb0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
bbc0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
bbd0: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
bbe0: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
bbf0: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
bc00: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
bc10: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
bc20: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
bc30: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
bc40: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
bc50: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
bc60: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
bc70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
bc80: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
bc90: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
bca0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
bcb0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
bcc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
bcd0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
bce0: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
bcf0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
bd00: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
bd10: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
bd20: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
bd30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
bd40: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
bd50: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
bd60: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
bd70: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
bd80: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
bd90: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
bda0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
bdb0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
bdc0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
bdd0: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
bde0: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
bdf0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
be00: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
be10: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
be20: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
be30: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
be40: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
be50: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
be60: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
be70: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
be80: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
be90: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
bea0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
beb0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
bec0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
bed0: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
bee0: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
bef0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
bf00: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
bf10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
bf20: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
bf30: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
bf40: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
bf50: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
bf60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bf70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
bf80: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
bf90: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
bfa0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
bfb0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
bfc0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
bfd0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
bfe0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
bff0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
c000: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
c010: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
c020: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
c030: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
c040: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
c050: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
c060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c070: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
c080: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
c090: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
c0a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c0b0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
c0c0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
c0d0: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
c0e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
c0f0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
c100: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
c110: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
c120: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
c130: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
c140: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
c150: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
c160: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
c170: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
c180: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c190: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
c1a0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
c1b0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
c1c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
c1d0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
c1e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
c1f0: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
c200: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
c210: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
c220: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
c230: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
c240: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
c250: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
c260: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
c270: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
c280: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
c290: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
c2a0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
c2b0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
c2c0: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
c2d0: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
c2e0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
c2f0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
c300: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
c310: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
c320: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
c330: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
c340: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
c350: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
c360: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
c370: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
c380: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
c390: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
c3a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
c3b0: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
c3c0: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
c3d0: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
c3e0: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
c3f0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
c400: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
c410: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
c420: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
c430: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
c440: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
c450: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
c460: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
c470: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
c480: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
c490: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
c4a0: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
c4b0: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
c4c0: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
c4d0: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
c4e0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
c4f0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
c500: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
c510: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
c520: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
c530: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
c540: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
c570: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
c580: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
c590: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c5a0: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
c5b0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
c5e0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
c5f0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
c600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c610: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
c620: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
c630: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
c640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c650: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
c660: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
c670: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c690: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
c6a0: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
c6b0: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c6d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c6e0: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
c6f0: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
c700: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
c710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c720: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
c730: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
c740: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c760: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c770: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
c7a0: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
c7b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
c7c0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c7e0: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
c7f0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
c800: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
c830: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
c840: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
c850: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
c860: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
c870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
c880: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
c890: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
c8a0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
c8b0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
c8c0: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
c8d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
c8e0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
c8f0: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
c900: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
c910: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
c920: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
c930: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
c940: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
c950: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
c960: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
c970: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
c980: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
c990: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
c9a0: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
c9b0: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
c9c0: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
c9d0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
c9e0: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
c9f0: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
ca00: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
ca10: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
ca20: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
ca30: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
ca40: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
ca50: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
ca60: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
ca70: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
ca80: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
ca90: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
caa0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
cab0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
cac0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
cad0: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
cae0: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
caf0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
cb00: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
cb10: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
cb20: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
cb30: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
cb40: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
cb50: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
cb60: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
cb70: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
cb80: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
cb90: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
cba0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
cbb0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
cbc0: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
cbd0: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
cbe0: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
cbf0: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
cc00: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
cc10: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
cc20: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
cc30: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
cc40: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
cc50: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
cc60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
cc70: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
cc80: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41  aOp[pParse->nOpA
cc90: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
cca0: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
ccb0: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
ccc0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
ccd0: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
cce0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
ccf0: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
cd00: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
cd10: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
cd20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
cd30: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
cd40: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
cd50: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
cd60: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
cd70: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
cd80: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
cd90: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
cda0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
cdb0: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
cdc0: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
cdd0: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
cde0: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
cdf0: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
ce00: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
ce10: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
ce20: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
ce30: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
ce40: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
ce50: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
ce60: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
ce70: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
ce80: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
ce90: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
cea0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
ceb0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
cec0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
ced0: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
cee0: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
cef0: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
cf00: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
cf10: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
cf20: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
cf30: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
cf40: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
cf50: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
cf60: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
cf70: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
cf80: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
cf90: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
cfa0: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
cfb0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
cfc0: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
cfd0: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
cfe0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
cff0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
d000: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
d010: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
d020: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
d030: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
d040: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
d050: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
d060: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
d070: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
d080: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
d090: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d0a0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
d0b0: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
d0c0: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
d0d0: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
d0e0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
d0f0: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
d100: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
d110: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
d120: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
d130: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d140: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
d150: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
d160: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
d170: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
d180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d190: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
d1a0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
d1b0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
d1c0: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
d1d0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
d1e0: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
d1f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
d200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d210: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
d220: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
d230: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
d240: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
d250: 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c  eof(i64), &zCsr,
d260: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d270: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e  #endif.    if( n
d280: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
d290: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
d2a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d2b0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
d2c0: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
d2d0: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
d2e0: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
d2f0: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
d300: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d310: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
d320: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
d330: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
d340: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
d350: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
d360: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
d370: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
d380: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
d390: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
d3a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
d3b0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
d3c0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
d3d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
d3e0: 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a  ar && pParse->nz
d3f0: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  Var>0 ){.    p->
d400: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
d410: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
d420: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
d430: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
d440: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
d450: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
d460: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
d470: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
d480: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
d490: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
d4a0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
d4b0: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
d4c0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
d4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
d4e0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
d4f0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
d500: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
d510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
d520: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
d530: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
d540: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
d550: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
d560: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
d570: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
d580: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
d590: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
d5a0: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
d5b0: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
d5c0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
d5d0: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
d5e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
d5f0: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
d600: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
d610: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
d620: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
d630: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
d640: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d650: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
d660: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
d670: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
d680: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
d6a0: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
d6b0: 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d  pCx);.  if( pCx-
d6c0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
d6d0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
d6e0: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
d6f0: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
d700: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
d710: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
d720: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
d730: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
d740: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
d750: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
d760: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d770: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
d780: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
d790: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d7a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d7b0: 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66 28 20  ABLE.  else if( 
d7c0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
d7d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d7e0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
d7f0: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
d800: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
d810: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
d820: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
d830: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
d840: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
d850: 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 43    assert( pVtabC
d860: 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  ursor->pVtab->nR
d870: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56 74 61  ef>0 );.    pVta
d880: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d890: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64  nRef--;.    pMod
d8a0: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
d8b0: 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 65  bCursor);.  }.#e
d8c0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
d8d0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
d8e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
d8f0: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
d900: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
d910: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
d920: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
d930: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
d940: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d950: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
d960: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
d970: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
d980: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d990: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
d9a0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
d9b0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
d9c0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
d9d0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d9e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
d9f0: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
da00: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
da10: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
da20: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
da30: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
da40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
da50: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
da60: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
da70: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
da80: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
da90: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
daa0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
dab0: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
dac0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
dad0: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
dae0: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
daf0: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
db00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
db10: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
db20: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
db30: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
db40: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
db50: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
db60: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
db70: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
db80: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
db90: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
dba0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
dbb0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
dbc0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
dbd0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
dbe0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
dbf0: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
dc00: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
dc10: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
dc20: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
dc30: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
dc40: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
dc50: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
dc60: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
dc70: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
dc80: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
dc90: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
dca0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
dcb0: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
dcc0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
dcd0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
dce0: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
dcf0: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
dd00: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
dd10: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
dd20: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
dd30: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
dd40: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
dd50: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
dd60: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
dd70: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
dd80: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
dd90: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
dda0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
ddb0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
ddc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
ddd0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
dde0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
ddf0: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
de00: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
de10: 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
de20: 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
de30: 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
de40: 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
de50: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
de60: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
de70: 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d  (pFrame);.    p-
de80: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20  >pFrame = 0;.   
de90: 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
dea0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
deb0: 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  >nFrame==0 );.  
dec0: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
ded0: 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ame(p);.  if( p-
dee0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
def0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
df00: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
df10: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
df20: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
df30: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
df40: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
df50: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
df60: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
df70: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
df80: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
df90: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(pDel);.  }..  
dfa0: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75  /* Delete any au
dfb0: 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e  xdata allocation
dfc0: 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d  s made by the VM
dfd0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75   */.  if( p->pAu
dfe0: 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56  xData ) sqlite3V
dff0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
e000: 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  (p, -1, 0);.  as
e010: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
e020: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
e030: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
e040: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
e050: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
e060: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
e070: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
e080: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
e090: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e0a0: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
e0b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
e0c0: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
e0d0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
e0e0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
e0f0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
e100: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e110: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
e120: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
e130: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
e140: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
e150: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
e160: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
e170: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
e180: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
e190: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
e1a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
e1b0: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
e1c0: 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
e1d0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
e1e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
e1f0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
e200: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
e210: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e230: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
e240: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
e250: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e260: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
e270: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
e280: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
e290: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
e2a0: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
e2b0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
e2c0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
e2d0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
e2e0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
e2f0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
e300: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
e310: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
e320: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
e330: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
e340: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
e350: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
e360: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
e370: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
e380: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
e390: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
e3a0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
e3b0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
e3c0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
e3d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e3e0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
e3f0: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
e400: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
e410: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
e420: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
e430: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
e440: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
e450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e460: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
e470: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
e480: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
e490: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
e4a0: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
e4b0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
e4c0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
e4d0: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
e4e0: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
e4f0: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
e500: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
e510: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
e520: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
e530: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
e540: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
e550: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
e560: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
e570: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
e580: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
e590: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
e5a0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
e5b0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
e5c0: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
e5d0: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
e5e0: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
e5f0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
e600: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
e610: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
e620: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
e630: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
e640: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
e650: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
e660: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
e670: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
e680: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
e690: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
e6a0: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
e6b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e6c0: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
e6d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e6e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
e6f0: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
e700: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e730: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
e740: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
e750: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
e780: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
e790: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
e7a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
e7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
e7c0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
e7d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
e7e0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
e7f0: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
e800: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
e810: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
e820: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
e830: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e840: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
e850: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
e860: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
e870: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
e880: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
e890: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e8a0: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
e8b0: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
e8c0: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
e8d0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e8e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e8f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
e900: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
e910: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
e920: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
e930: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
e940: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e950: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
e960: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
e970: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
e980: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
e990: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
e9a0: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
e9b0: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
e9c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
e9e0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
e9f0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
ea00: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
ea10: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
ea20: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
ea30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
ea40: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
ea50: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
ea60: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ea70: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
ea80: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
ea90: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
eaa0: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
eab0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
eac0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
ead0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
eae0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
eaf0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
eb00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
eb10: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
eb20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
eb30: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
eb40: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
eb50: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
eb60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
eb70: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
eb80: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  it = 0;..#ifdef 
eb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
eba0: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69  UALTABLE.  /* Wi
ebb0: 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  th this option, 
ebc0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
ebd0: 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
ebe0: 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20  be simply .  ** 
ebf0: 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69  SQLITE_OK so p i
ec00: 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a  s not used. .  *
ec10: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
ec20: 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ETER(p);.#endif.
ec30: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
ec40: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
ec50: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
ec60: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
ec70: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
ec80: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
ec90: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
eca0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
ecb0: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
ecc0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
ecd0: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
ece0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ecf0: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
ed00: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
ed10: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
ed20: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
ed30: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
ed40: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
ed50: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
ed60: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
ed70: 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  c(db, p);..  /* 
ed80: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
ed90: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
eda0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
edb0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
edc0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
edd0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
ede0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
edf0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
ee00: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
ee10: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
ee20: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
ee30: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
ee40: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
ee50: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
ee60: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
ee70: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
ee80: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
ee90: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
eea0: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
eeb0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
eec0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
eed0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
eee0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
eef0: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
ef00: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
ef10: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
ef20: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
ef30: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
ef40: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
ef50: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
ef60: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
ef70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ef80: 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
ef90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
efa0: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
efb0: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
efc0: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20  ger(pBt));.     
efd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
efe0: 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
eff0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
f000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
f010: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
f020: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
f030: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
f040: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
f050: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
f060: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
f070: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
f080: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
f090: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
f0a0: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
f0b0: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
f0c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f0d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f0e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
f0f0: 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
f100: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
f110: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
f120: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
f130: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
f140: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
f150: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
f160: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
f170: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
f180: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f190: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
f1a0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
f1b0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
f1c0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
f1d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
f1e0: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
f1f0: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
f200: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
f210: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
f220: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
f230: 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
f240: 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
f250: 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
f260: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
f270: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
f280: 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
f290: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
f2a0: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
f2b0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
f2c0: 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
f2d0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
f2e0: 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
f2f0: 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
f300: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
f310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f320: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f330: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f340: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f350: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f360: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f380: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
f390: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f3a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
f3b0: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
f3c0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
f3d0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
f3e0: 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
f3f0: 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
f400: 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
f410: 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
f420: 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
f430: 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
f440: 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
f450: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
f460: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
f470: 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
f480: 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
f490: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
f4a0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
f4b0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
f4c0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
f4d0: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
f4e0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
f4f0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
f500: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
f510: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f520: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f530: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
f540: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f550: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
f560: 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
f570: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f580: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f590: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
f5a0: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
f5b0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
f5c0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
f5d0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
f5e0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
f5f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
f600: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
f610: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
f620: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f630: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
f640: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
f650: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
f660: 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
f670: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f680: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
f690: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
f6a0: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
f6b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
f6c0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
f6d0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
f6e0: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
f6f0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
f700: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
f710: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
f720: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
f730: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
f740: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
f750: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
f760: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
f770: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
f780: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
f790: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
f7a0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
f7b0: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
f7c0: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
f7d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
f7e0: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
f7f0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
f800: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
f810: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
f820: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
f830: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
f840: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
f850: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
f860: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
f870: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
f880: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
f890: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
f8a0: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
f8b0: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
f8c0: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
f8d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
f8e0: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
f8f0: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
f900: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f920: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f930: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f950: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
f960: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
f970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
f980: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
f990: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
f9a0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f9b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f9c0: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
f9d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
f9e0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f9f0: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
fa00: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
fa10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
fa20: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
fa30: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
fa40: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
fa70: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
fa80: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
fa90: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
faa0: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
fab0: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
fac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
fad0: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
fae0: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
faf0: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
fb00: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
fb10: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
fb20: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
fb30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
fb40: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
fb50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
fb60: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
fb70: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
fb80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fb90: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
fba0: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
fbb0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
fbc0: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
fbd0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
fbe0: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
fbf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fc00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
fc10: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
fc20: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
fc30: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
fc40: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
fc50: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
fc60: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
fc70: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
fc80: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
fc90: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
fca0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
fcb0: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
fcc0: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
fcd0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
fce0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
fcf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fd10: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
fd20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fd30: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
fd40: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
fd50: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
fd60: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
fd70: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
fd80: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
fd90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
fda0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
fdb0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
fdc0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
fdd0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
fde0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
fdf0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
fe00: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
fe10: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
fe20: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
fe30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fe40: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
fe50: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
fe60: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
fe70: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
fe80: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
fe90: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
fea0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
feb0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fec0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fed0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
fee0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
fef0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
ff00: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
ff10: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
ff20: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
ff30: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
ff40: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
ff50: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
ff60: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
ff70: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
ff80: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
ff90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ffa0: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
ffb0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
ffc0: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
ffd0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
ffe0: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
fff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
10000 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
10010 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
10020 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10030 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
10040 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10050 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
10060 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
10070 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
10080 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
10090 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
100a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
100b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
100c0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
100d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
100e0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
100f0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
10100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10110 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
10120 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
10130 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10140 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10150 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
10160 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10170 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10180 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
10190 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
101a0 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
101b0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
101c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
101d0 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
101e0 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
101f0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
10200 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
10210 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
10220 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
10230 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10240 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
10250 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
10260 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
10270 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10280 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
10290 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
102a0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
102b0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
102c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
102d0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
102e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
102f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10300 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
10310 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
10320 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
10330 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
10340 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
10350 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10360 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
10370 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
10380 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
10390 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
103a0 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
103b0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
103c0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
103d0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
103e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
103f0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
10400 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
10410 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10420 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
10430 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
10440 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
10450 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
10460 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
10470 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
10480 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
10490 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
104a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
104b0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
104c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
104d0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
104e0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
104f0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
10500 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
10510 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10520 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10530 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10540 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10550 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10560 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
10570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10580 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
10590 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
105a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
105b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
105c0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
105d0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
105e0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
105f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10620 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
10630 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10640 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
10650 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10660 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
10670 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
10680 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
10690 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
106a0 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
106b0 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
106c0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
106d0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
106e0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
106f0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
10700 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10710 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
10720 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64  s, zMaster, need
10730 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Sync);.    sqlit
10740 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10750 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
10760 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
10770 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
10780 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10790 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
107a0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
107b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
107c0 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
107d0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
107e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
107f0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10800 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
10810 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
10820 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
10830 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10840 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
10850 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
10860 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
10870 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
10880 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
10890 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
108a0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
108b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
108c0 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
108d0 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
108e0 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
108f0 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
10900 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
10910 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
10920 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
10930 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
10940 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
10950 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10960 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
10970 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
10980 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
10990 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
109a0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
109b0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
109c0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
109d0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
109e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
109f0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10a00 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
10a10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
10a20 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
10a30 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
10a40 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10a50 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
10a60 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10a70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
10a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
10a90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10aa0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
10ab0 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
10ac0 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
10ad0 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
10ae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
10af0 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
10b00 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
10b10 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
10b20 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
10b30 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
10b40 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
10b50 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
10b60 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
10b70 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
10b80 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
10b90 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
10ba0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
10bb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
10bc0 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
10bd0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
10be0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
10bf0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
10c00 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
10c10 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
10c20 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
10c30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
10c40 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
10c50 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
10c60 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
10c70 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
10c80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
10c90 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
10ca0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
10cb0 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
10cc0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
10cd0 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
10ce0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
10cf0 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
10d00 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
10d10 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
10d20 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
10d30 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
10d40 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
10d50 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
10d60 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
10d70 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
10d80 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10d90 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
10da0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
10db0 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
10dc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
10dd0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
10de0 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
10df0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
10e00 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
10e10 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
10e20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
10e30 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
10e40 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
10e50 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
10e60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10e70 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
10e80 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
10e90 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
10ea0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
10eb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10ec0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
10ed0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10ee0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
10ef0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
10f00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
10f10 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
10f20 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
10f30 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
10f40 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
10f50 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
10f60 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
10f70 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
10f80 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
10f90 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
10fa0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
10fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
10fc0 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
10fd0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
10fe0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
10ff0 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
11000 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
11010 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
11020 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
11030 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
11040 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
11050 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
11060 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
11070 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20  curred, causing 
11080 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
11090 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
110a0 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
110b0 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
110c0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
110d0 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
110e0 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
110f0 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
11100 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
11110 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
11120 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
11130 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
11140 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
11150 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11160 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
11170 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
11180 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11190 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
111a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
111b0 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
111c0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
111d0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
111e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
111f0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
11200 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
11210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
11220 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11230 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11240 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
11250 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
11260 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11280 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
11290 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
112a0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
112b0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
112c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
112d0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
112e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
112f0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
11300 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
11310 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
11320 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
11330 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11340 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11360 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
11370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11380 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
11390 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
113a0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
113b0 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
113c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
113d0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
113e0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
113f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11400 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
11410 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
11420 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
11430 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
11440 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
11450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11470 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
11480 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
11490 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
114a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
114b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
114c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
114d0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
114e0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
114f0 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
11500 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
11510 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
11520 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
11530 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
11540 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
11550 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
11560 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11570 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
11580 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
11590 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
115a0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
115b0 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
115c0 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20  tDefCons;.      
115d0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
115e0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
115f0 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d  efImmCons;.    }
11600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11620 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11630 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
11640 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
11650 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
11660 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
11670 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
11680 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
11690 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
116a0 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
116b0 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
116c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
116d0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
116e0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
116f0 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
11700 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
11710 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
11720 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
11730 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
11740 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
11750 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
11760 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
11770 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
11780 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
11790 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
117a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
117b0 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
117c0 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
117d0 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
117e0 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
117f0 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
11800 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
11810 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
11820 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
11830 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
11840 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
11850 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11860 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
11870 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
11880 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
11890 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
118a0 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
118b0 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
118c0 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
118d0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
118e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
118f0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
11900 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
11910 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
11920 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
11930 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
11940 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
11950 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11960 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11980 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
119a0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
119b0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
119c0 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
119d0 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
119e0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
119f0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
11a00 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
11a10 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
11a20 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
11a30 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
11a40 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
11a50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11a60 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
11a70 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
11a80 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
11a90 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
11aa0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
11ab0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
11ac0 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
11ad0 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
11ae0 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
11af0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
11b00 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
11b10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
11b20 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
11b30 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
11b40 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
11b50 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
11b60 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
11b70 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
11b80 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
11b90 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
11ba0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
11bb0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
11bc0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
11bd0 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
11be0 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
11bf0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
11c00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c20 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
11c30 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
11c40 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
11c50 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11c60 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
11c70 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
11c80 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
11c90 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
11ca0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
11cb0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
11cc0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
11cd0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
11ce0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
11cf0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11d00 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
11d10 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
11d20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
11d30 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
11d40 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
11d50 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
11d60 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
11d70 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
11d80 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
11d90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
11da0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
11db0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
11dc0 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
11dd0 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
11de0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11df0 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11e00 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11e10 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11e20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
11e30 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
11e40 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
11e50 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
11e60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
11e70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11e80 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
11e90 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
11ea0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
11eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11ec0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
11ed0 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
11ee0 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
11ef0 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
11f00 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
11f10 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
11f20 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
11f30 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
11f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11f50 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
11f60 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
11f70 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
11f80 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
11f90 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
11fa0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
11fb0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
11fc0 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
11fd0 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
11fe0 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
11ff0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
12000 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
12010 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
12020 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
12030 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
12040 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
12050 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
12060 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
12070 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
12090 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
120a0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
120b0 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
120c0 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
120d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
120e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
120f0 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
12100 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
12110 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
12120 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
12130 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
12140 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
12150 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
12160 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
12170 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
121a0 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
121b0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
121c0 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
121d0 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
121e0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
121f0 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
12200 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12210 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
12220 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
12230 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
12240 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
12250 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
12260 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
12270 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12280 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
12290 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
122a0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
122b0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
122c0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
122d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
122e0 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
122f0 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
12300 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
12310 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
12320 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
12330 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
12340 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
12350 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
12360 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
12370 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
12380 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
12390 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
123a0 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
123b0 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
123c0 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
123d0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
123e0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
123f0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
12400 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
12410 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
12420 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
12430 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
12440 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
12450 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
12460 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
12470 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
12480 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
12490 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
124a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
124b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
124c0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
124d0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
124e0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
124f0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
12500 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
12510 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
12520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12530 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
12540 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
12550 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
12560 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
12570 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
12580 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
12590 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
125a0 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
125b0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
125c0 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
125d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
125e0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
125f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
12600 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
12610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12620 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
12640 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
12650 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
12660 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
12670 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12680 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
12690 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
126a0 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
126b0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
126c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
126d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
126e0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
126f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
12700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
12710 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
12720 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
12730 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
12740 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
12750 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
12760 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
12770 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
12780 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
12790 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
127a0 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
127b0 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
127c0 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
127d0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
127e0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
127f0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
12800 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
12810 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
12820 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
12830 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
12840 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
12850 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
12860 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
12870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
12880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
12890 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
128a0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
128b0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
128c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
128d0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
128e0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
128f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
12910 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
12920 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
12930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12940 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12960 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
12970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
12990 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
129a0 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
129b0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
129c0 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
129d0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
129e0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
129f0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
12a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
12a10 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
12a20 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
12a30 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
12a40 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
12a50 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
12a60 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
12a70 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
12a80 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
12a90 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
12aa0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
12ab0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
12ac0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
12ad0 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
12ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
12b00 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
12b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12b20 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12b30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12b40 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
12b50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
12b80 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
12b90 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12ba0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12bb0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
12bc0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
12bd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12be0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
12bf0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
12c00 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
12c10 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
12c20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
12c30 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
12c40 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
12c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
12c60 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
12c70 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
12c80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
12c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12ca0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12cb0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
12cc0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
12cd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
12ce0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
12cf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
12d00 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
12d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
12d20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12d30 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
12d40 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
12d50 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
12d60 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
12d70 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
12d80 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
12d90 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
12da0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
12db0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
12dc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
12dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12de0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12df0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12e00 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12e10 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12e20 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12e30 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12e40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12e50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
12e60 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
12e70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
12e80 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
12e90 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
12ea0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
12eb0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
12ec0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
12ed0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
12ee0 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
12ef0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
12f00 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
12f10 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
12f20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
12f30 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
12f40 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
12f50 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
12f60 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
12f70 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
12f80 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
12f90 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
12fa0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
12fb0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
12fc0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
12fd0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
12fe0 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
12ff0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
13000 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
13010 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
13020 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13030 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13040 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
13050 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
13060 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
13070 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
13080 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
13090 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
130a0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
130b0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
130c0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
130d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
130e0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
130f0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
13100 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
13110 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
13120 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
13130 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
13140 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
13150 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
13160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13170 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
13180 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
13190 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
131a0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
131b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
131c0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
131d0 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
131e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
131f0 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
13200 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
13210 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
13220 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
13230 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
13240 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
13250 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
13260 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
13270 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
13280 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
13290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
132a0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
132b0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
132c0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
132d0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
132e0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
132f0 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
13300 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
13310 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
13320 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
13330 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
13340 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
13350 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
13360 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
13370 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
13380 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
13390 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
133a0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
133b0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
133c0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
133d0 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
133e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
133f0 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
13400 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
13410 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
13420 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
13430 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
13440 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
13450 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
13460 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
13470 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
13480 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
13490 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
134a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
134b0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
134c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
134d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
134e0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
134f0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
13500 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
13510 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
13520 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
13530 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
13540 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
13550 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
13560 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
13570 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
13580 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
13590 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
135a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
135b0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
135c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
135d0 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
135e0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
135f0 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
13600 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  e>0 || db->autoC
13610 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
13620 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
13630 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
13640 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20  ==SQLITE_BUSY ? 
13650 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51  SQLITE_BUSY : SQ
13660 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a  LITE_OK);.}.../*
13670 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
13680 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
13690 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
136a0 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
136b0 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
136c0 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
136d0 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
136e0 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
136f0 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
13700 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
13710 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
13720 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
13730 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13740 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63  Copy the error c
13750 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
13760 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  ssage belonging 
13770 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73  to the VDBE pass
13780 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
13790 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  st argument to i
137a0 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ts database hand
137b0 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79  le (so that they
137c0 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74   will be .** ret
137d0 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74  urned by calls t
137e0 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  o sqlite3_errcod
137f0 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  e() and sqlite3_
13800 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a  errmsg())..**.**
13810 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
13820 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68  oes not clear th
13830 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64  e VDBE error cod
13840 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75  e or message, ju
13850 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65  st.** copies the
13860 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  m to the databas
13870 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
13880 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
13890 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a  sferError(Vdbe *
138a0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
138b0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
138c0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
138d0 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
138e0 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61  .    u8 mallocFa
138f0 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
13900 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c  cFailed;.    sql
13910 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
13920 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
13930 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
13940 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
13950 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
13960 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
13970 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
13980 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
13990 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
139a0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
139b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
139c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
139d0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
139e0 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65  ed = mallocFaile
139f0 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  d;.    db->errCo
13a00 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65  de = rc;.  }else
13a10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13a20 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
13a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13a40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13a50 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
13a60 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43  * If an SQLITE_C
13a70 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f  ONFIG_SQLLOG hoo
13a80 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  k is registered 
13a90 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  and the VM has b
13aa0 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76  een run, .** inv
13ab0 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  oke it..*/.stati
13ac0 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b  c void vdbeInvok
13ad0 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29  eSqllog(Vdbe *v)
13ae0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  {.  if( sqlite3G
13af0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
13b00 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51  log && v->rc==SQ
13b10 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53  LITE_OK && v->zS
13b20 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29  ql && v->pc>=0 )
13b30 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70  {.    char *zExp
13b40 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56  anded = sqlite3V
13b50 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20  dbeExpandSql(v, 
13b60 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73  v->zSql);.    as
13b70 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69  sert( v->db->ini
13b80 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
13b90 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29   if( zExpanded )
13ba0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
13bb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
13bc0 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73  log(.          s
13bd0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13be0 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76  ig.pSqllogArg, v
13bf0 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c  ->db, zExpanded,
13c00 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   1.      );.    
13c10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13c20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13c30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
13c40 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
13c50 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78  beInvokeSqllog(x
13c60 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13c70 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
13c80 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
13c90 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
13ca0 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
13cb0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
13cc0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
13cd0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
13ce0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
13cf0 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
13d00 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
13d10 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
13d20 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
13d30 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
13d40 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
13d50 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
13d60 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
13d70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
13d80 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
13d90 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
13da0 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
13db0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
13dc0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
13dd0 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
13de0 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
13df0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
13e00 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
13e10 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
13e20 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
13e30 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
13e40 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
13e50 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
13e60 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
13e70 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
13e80 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
13e90 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
13ea0 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
13eb0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
13ec0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
13ed0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
13ee0 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
13ef0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
13f00 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
13f10 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
13f20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
13f30 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
13f40 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
13f50 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
13f60 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
13f70 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
13f80 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
13f90 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
13fa0 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
13fb0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
13fc0 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
13fd0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
13fe0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
13ff0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
14000 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14010 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
14020 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
14030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14040 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
14050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14060 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
14070 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
14080 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
14090 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65  ( p->runOnlyOnce
140a0 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20   ) p->expired = 
140b0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
140c0 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
140d0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
140e0 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
140f0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
14100 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
14110 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
14120 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
14130 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
14140 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
14150 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
14160 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
14170 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
14180 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
14190 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
141a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
141b0 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72  WithMsg(db, p->r
141c0 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20  c, p->zErrMsg ? 
141d0 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72  "%s" : 0, p->zEr
141e0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
141f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14200 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
14210 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
14220 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
14230 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
14240 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
14250 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
14260 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
14270 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
14280 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
14290 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
142a0 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
142b0 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
142c0 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
142d0 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
142e0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
142f0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
14300 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
14310 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
14320 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
14330 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
14340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
14350 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
14360 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
14370 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
14380 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
14390 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
143a0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
143b0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
143c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
143d0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
143e0 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
143f0 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
14400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14410 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
14420 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
14430 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
14440 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
14450 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
14460 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
14470 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
14480 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
14490 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
144a0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
144b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
144c0 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
144d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
144e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
144f0 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
14500 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
14510 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
14520 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
14530 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
14540 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
14550 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
14560 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
14570 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
14580 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
14590 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
145a0 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
145b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
145c0 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
145d0 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
145e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
145f0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
14600 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14610 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
14620 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = 0;.  p->magic
14630 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
14640 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
14650 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
14660 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
14670 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
14680 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
14690 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
146a0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
146b0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
146c0 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
146d0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
146e0 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
146f0 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
14700 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
14710 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
14720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14730 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
14740 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
14750 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
14760 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
14770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14780 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
14790 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
147a0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
147b0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
147c0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
147d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
147e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
147f0 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
14800 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
14810 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
14820 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
14830 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
14840 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
14850 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
14860 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
14870 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
14880 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
14890 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
148a0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
148b0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
148c0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
148d0 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
148e0 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
148f0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
14900 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
14910 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
14920 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
14930 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
14940 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
14950 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
14960 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
14970 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
14980 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
14990 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
149a0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
149b0 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
149c0 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
149d0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
149e0 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
149f0 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
14a00 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
14a10 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
14a20 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
14a30 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
14a40 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
14a50 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
14a60 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
14a70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
14a80 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
14a90 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70   *pVdbe, int iOp
14aa0 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41  , int mask){.  A
14ab0 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70  uxData **pp = &p
14ac0 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  Vdbe->pAuxData;.
14ad0 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
14ae0 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
14af0 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
14b00 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
14b10 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70   (pAux->iOp==iOp
14b20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e   && (pAux->iArg>
14b30 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
14b40 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
14b50 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20  Arg)))).    ){. 
14b60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14b70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b  Aux->iArg==31 );
14b80 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
14b90 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
14ba0 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
14bb0 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
14bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
14bd0 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a   = pAux->pNext;.
14be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14bf0 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70  ree(pVdbe->db, p
14c00 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Aux);.    }else{
14c10 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78  .      pp= &pAux
14c20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
14c30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
14c40 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
14c50 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
14c60 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
14c70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14c80 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
14c90 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
14ca0 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
14cb0 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
14cc0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
14cd0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14ce0 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
14cf0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
14d00 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
14d10 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
14d20 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
14d30 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
14d40 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
14d50 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14d60 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
14d70 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
14d80 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
14d90 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
14da0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
14db0 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
14dc0 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
14dd0 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ext;.  int i;.  
14de0 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
14df0 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
14e00 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
14e10 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
14e20 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  Var);.  releaseM
14e30 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
14e40 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
14e50 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
14e60 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
14e70 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
14e80 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
14e90 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
14ea0 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
14eb0 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
14ec0 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
14ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
14ee0 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
14ef0 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a   }.  for(i=p->nz
14f00 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Var-1; i>=0; i--
14f10 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
14f20 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29  db, p->azVar[i])
14f30 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  ;.  vdbeFreeOpAr
14f40 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
14f50 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
14f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14f70 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
14f80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14f90 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  ->zSql);.  sqlit
14fa0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14fb0 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53  pFree);.#ifdef S
14fc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
14fd0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66  T_SCANSTATUS.  f
14fe0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63  or(i=0; i<p->nSc
14ff0 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  an; i++){.    sq
15000 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15010 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
15020 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
15030 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
15040 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Scan);.#endif.}.
15050 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
15060 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
15070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
15080 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
15090 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
150a0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
150b0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
150c0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
150d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
150e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
150f0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15100 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
15110 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
15120 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
15130 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
15140 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
15150 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
15160 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
15170 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
15180 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
15190 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
151a0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
151b0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
151c0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
151d0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
151e0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
151f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15200 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
15210 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
15220 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
15230 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
15240 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
15250 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
15260 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
15270 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
15280 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
15290 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
152a0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
152b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
152c0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
152d0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
152e0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
152f0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
15300 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
15310 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
15320 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
15330 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
15340 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
15350 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
15360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
15370 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73  able );.  rc = s
15380 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
15390 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
153a0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
153b0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
153c0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
153d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
153e0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
153f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15400 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
15410 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
15420 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
15430 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
15440 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
15450 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
15460 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
15470 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15480 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
15490 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
154a0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
154b0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
154c0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
154d0 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
154e0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
154f0 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
15500 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
15510 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
15520 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
15530 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
15540 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
15550 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
15560 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
15570 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
15580 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
15590 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
155a0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
155b0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
155c0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
155d0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
155e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
155f0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
15600 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
15610 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
15620 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
15630 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
15640 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
15650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15660 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
15670 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
15680 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15690 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
156a0 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ore(p->pCursor, 
156b0 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29  &isDifferentRow)
156c0 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
156d0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
156e0 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72  ;.  if( isDiffer
156f0 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c  entRow ) p->null
15700 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Row = 1;.  retur
15710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15720 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74  heck to ensure t
15730 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
15740 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72  s valid.  Restor
15750 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
15760 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74  if need be.  Ret
15770 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f  urn any I/O erro
15780 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f  r from the resto
15790 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  re operation..*/
157a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
157b0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64  CursorRestore(Vd
157c0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
157d0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
157e0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
157f0 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->pCursor) ){.  
15800 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
15810 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
15820 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15840 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
15850 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
15860 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
15870 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
15880 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
15890 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
158a0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
158b0 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
158c0 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
158d0 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
158e0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
158f0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
15900 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
15910 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
15920 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
15930 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
15940 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
15950 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
15960 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
15970 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
15980 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
15990 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
159a0 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
159b0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
159c0 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
159d0 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
159e0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
159f0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
15a00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
15a10 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
15a20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
15a30 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
15a40 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
15a50 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
15a60 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
15a70 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
15a80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15a90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15aa0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
15ab0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
15ac0 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
15ad0 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72  dMoveto ){.    r
15ae0 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65  eturn handleDefe
15af0 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20  rredMoveto(p);. 
15b00 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75 72   }.  if( p->pCur
15b10 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42 74  sor && sqlite3Bt
15b20 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
15b30 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  d(p->pCursor) ){
15b40 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
15b50 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
15b60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15b70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15b80 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
15b90 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
15ba0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
15bb0 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
15bc0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15bd0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
15be0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
15bf0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
15c00 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
15c10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15c20 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
15c30 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
15c40 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
15c50 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
15c60 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
15c70 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
15c80 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
15c90 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
15ca0 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
15cb0 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
15cc0 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
15cd0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
15ce0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
15cf0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
15d00 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
15d10 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
15d20 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
15d30 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
15d40 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
15d50 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
15d60 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
15d70 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
15d80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
15d90 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
15da0 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
15db0 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
15dc0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
15dd0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
15de0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
15df0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
15e00 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
15e10 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
15e20 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
15e30 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
15e40 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
15e50 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
15e60 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
15e70 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
15e80 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
15e90 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
15ea0 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
15eb0 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
15ec0 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
15ed0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
15ee0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
15ef0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
15f00 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
15f10 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
15f20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
15f30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15f40 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
15f50 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
15f60 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15f70 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15f80 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
15fb0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15fc0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
15fd0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
15fe0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15ff0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
16020 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
16030 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
16050 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
16060 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
16070 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
16080 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
16090 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
160a0 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
160d0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
160e0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
160f0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
16100 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
16110 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
16120 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
16130 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
16140 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
16150 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
16160 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
16190 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
161a0 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
161b0 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
161c0 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
161d0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
161e0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
161f0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
16200 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
16210 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
16220 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
16230 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
16240 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
16250 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
16260 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
16270 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
16280 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
16290 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
162a0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
162b0 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
162c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
162d0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
162e0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
162f0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
16300 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
16310 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  32 n;..  if( fla
16320 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
16330 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16340 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
16350 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
16360 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
16370 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
16380 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
16390 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
163a0 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
163b0 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
163c0 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
163d0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
163e0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
163f0 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
16400 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
16410 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
16420 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
16430 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16440 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c  ((i&1)==i && fil
16450 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38  e_format>=4) ? 8
16460 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20  +(u32)u : 1;.   
16470 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
16480 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
16490 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
164a0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
164b0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
164c0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
164d0 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
164e0 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
164f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
16500 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
16510 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
16520 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
16530 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
16540 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
16550 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
16560 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
16570 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
16580 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
16590 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
165a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
165b0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
165c0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
165d0 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
165e0 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
165f0 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
16600 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
16610 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
16620 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 0a 2a  s less than 12.*
16630 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
16640 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
16650 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
16660 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
16670 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
16680 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0.};../*.** Ret
16690 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
166a0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
166b0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
166c0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
166d0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
166e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
166f0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
16700 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
16710 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
16720 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
16730 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
16740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
16750 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
16760 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
16770 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
16780 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
16790 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
167a0 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
167b0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
167c0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
167d0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
167e0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
167f0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
16800 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
16810 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
16820 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
16830 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
16840 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
16850 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
16860 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
16870 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
16880 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
16890 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
168a0 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
168b0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
168c0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
168d0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
168e0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
168f0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
16900 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
16910 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
16920 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
16930 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
16940 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
16950 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
16960 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
16970 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
16980 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
16990 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
169a0 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
169b0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
169c0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
169d0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
169e0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
169f0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
16a00 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
16a10 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
16a20 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
16a30 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
16a40 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
16a50 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
16a60 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
16a70 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
16a80 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
16a90 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
16aa0 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
16ab0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
16ac0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
16ad0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
16ae0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
16af0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
16b00 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
16b10 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
16b20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
16b30 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
16b40 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
16b50 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
16b60 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
16b70 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
16b80 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
16b90 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
16ba0 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
16bb0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
16bc0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
16bd0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
16be0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
16bf0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
16c00 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
16c10 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
16c20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
16c30 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
16c40 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
16c50 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
16c60 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
16c70 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
16c80 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
16c90 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
16ca0 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
16cb0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
16cc0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
16cd0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
16ce0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
16cf0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
16d00 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
16d10 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
16d20 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
16d30 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
16d40 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
16d50 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
16d60 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
16d70 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
16d80 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
16d90 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
16da0 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
16db0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
16dc0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
16dd0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
16de0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
16df0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
16e00 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
16e10 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16e20 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16e30 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
16e40 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
16e50 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
16e60 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
16e70 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
16e80 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
16e90 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
16ea0 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
16eb0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
16ec0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
16ed0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
16ee0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
16ef0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
16f00 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16f10 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16f20 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
16f30 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
16f40 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
16f50 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
16f60 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
16f70 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
16f80 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16f90 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
16fa0 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
16fb0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
16fc0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16fd0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
16fe0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
16ff0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
17000 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
17010 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
17020 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
17030 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
17040 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
17050 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
17060 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
17070 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
17080 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
17090 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
170a0 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
170b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
170c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
170d0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
170e0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
170f0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
17100 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
17110 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
17120 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
17130 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
17140 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
17150 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
17160 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
17170 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
17180 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
17190 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
171a0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
171b0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
171c0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
171d0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
171e0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
171f0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
17200 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
17210 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
17220 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
17230 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
17240 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
17250 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
17260 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
17270 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
17280 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
17290 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
172a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
172b0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
172c0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
172d0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
172e0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
172f0 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
17300 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
17310 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
17320 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
17330 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
17340 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
17350 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
17360 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
17370 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
17380 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
17390 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
173a0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
173b0 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
173c0 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
173d0 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
173e0 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
173f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17400 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
17410 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
17420 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
17430 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
17440 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
17450 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
17460 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
17470 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
17480 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17490 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
174a0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
174b0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
174c0 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
174d0 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
174e0 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
174f0 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
17500 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
17510 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
17520 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
17530 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
17540 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
17550 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
17560 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
17570 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
17580 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
17590 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
175a0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
175b0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
175c0 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
175d0 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
175e0 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
175f0 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
17600 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
17610 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
17620 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
17630 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
17640 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
17650 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
17660 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
17670 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
17680 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
17690 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
176a0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
176b0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
176c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
176d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
176e0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
176f0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
17700 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
17710 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
17720 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
17730 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
17740 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
17750 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
17760 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
17770 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
17780 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
17790 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
177a0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
177b0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
177c0 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
177d0 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
177e0 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
177f0 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
17800 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
17810 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
17820 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
17830 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
17840 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
17850 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
17860 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
17870 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
17880 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
178b0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
178c0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
178d0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
178e0 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
178f0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
17900 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
17910 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
17920 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
17930 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
17940 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
17950 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
17960 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
17970 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
17980 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
17990 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
179a0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
179b0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
179c0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
179d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
179e0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
179f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
17a00 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
17a10 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
17a20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
17a30 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
17a40 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
17a50 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
17a60 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
17a70 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
17a80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17a90 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
17aa0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
17ab0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
17ac0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
17ad0 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
17ae0 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
17af0 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
17b00 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
17b10 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
17b20 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
17b30 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
17b40 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
17b50 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
17b60 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
17b70 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
17b80 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
17b90 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
17ba0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
17bb0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
17bc0 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
17bd0 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
17be0 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
17bf0 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
17c00 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
17c10 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
17c20 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
17c30 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
17c40 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
17c50 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
17c60 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
17c70 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
17c80 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
17c90 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
17ca0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
17cb0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
17cc0 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
17cd0 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
17ce0 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
17cf0 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
17d00 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
17d10 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
17d20 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17d30 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
17d40 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
17d50 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
17d60 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
17d70 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
17d80 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
17d90 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
17da0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
17db0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
17dc0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
17dd0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
17de0 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
17df0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
17e00 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
17e10 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
17e20 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
17e30 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
17e40 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
17e50 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
17e60 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
17e70 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
17e80 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
17e90 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17ea0 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
17eb0 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
17ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
17ed0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
17ee0 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
17ef0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
17f00 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
17f10 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
17f20 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
17f30 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
17f40 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
17f50 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
17f60 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
17f70 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
17f80 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
17f90 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17fa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17fb0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
17fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
17fd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
17fe0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
17ff0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
18000 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18010 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
18020 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
18030 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
18040 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
18050 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
18060 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
18070 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
18080 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
18090 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
180a0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
180b0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
180c0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
180d0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
180e0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
180f0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
18100 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
18110 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
18120 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
18130 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
18140 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
18150 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
18160 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
18170 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
18180 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
18190 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
181a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
181b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
181c0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
181d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
181e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
181f0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
18200 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
18210 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18220 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
18230 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
18240 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
18250 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
18260 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
18270 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
18280 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
18290 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
182a0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
182b0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
182c0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
182d0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
182e0 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
182f0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
18300 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
18310 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
18320 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18330 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
18340 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
18350 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
18360 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
18370 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
18380 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
18390 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
183a0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
183b0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
183c0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
183d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
183e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
183f0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
18400 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
18410 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
18420 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
18430 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
18440 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
18450 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
18460 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
18470 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
18480 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
18490 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
184a0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
184b0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
184c0 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
184d0 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
184e0 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
184f0 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
18500 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
18510 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
18520 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
18530 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
18540 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
18550 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
18560 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
18570 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18580 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
18590 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
185a0 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
185b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
185c0 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
185d0 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
185e0 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
185f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
18600 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
18610 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
18620 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
18630 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
18640 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
18650 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
18660 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
18670 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
18680 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
18690 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
186a0 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
186b0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
186c0 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
186d0 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
186e0 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
186f0 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
18700 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
18710 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
18720 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
18730 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
18740 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
18750 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
18760 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
18770 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
18780 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
18790 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
187a0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
187b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
187c0 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
187d0 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
187e0 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
187f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18800 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
18810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
18820 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
18830 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
18840 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
18850 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
18860 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
18870 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
18880 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
18890 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
188a0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
188b0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
188c0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
188d0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
188e0 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
188f0 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
18900 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
18910 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
18920 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
18930 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
18940 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
18950 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
18960 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
18970 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
18980 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
18990 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
189a0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
189b0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
189c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
189d0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
189e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
189f0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
18a00 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
18a10 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
18a20 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
18a30 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
18a40 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
18a50 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
18a60 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18a70 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
18a80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
18a90 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
18aa0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
18ab0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
18ac0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
18ad0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
18ae0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
18af0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
18b00 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
18b10 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
18b20 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
18b30 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
18b40 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
18b50 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
18b60 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
18b70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18b80 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
18b90 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
18ba0 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
18bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18bc0 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
18bd0 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
18be0 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
18bf0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
18c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
18c10 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
18c20 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
18c30 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c50 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
18c60 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
18c70 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
18c80 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
18c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18ca0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
18cb0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
18cc0 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
18cd0 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
18ce0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
18cf0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
18d00 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
18d10 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
18d20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
18d30 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
18d40 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
18d50 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
18d60 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
18d70 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
18d80 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
18d90 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
18da0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
18db0 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
18dc0 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
18dd0 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
18de0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
18df0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
18e00 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
18e10 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
18e20 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
18e30 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
18e40 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
18e50 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
18e60 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
18e70 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
18e80 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
18e90 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
18ea0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
18eb0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
18ec0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
18ed0 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
18ee0 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
18ef0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
18f00 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
18f10 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
18f20 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
18f30 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
18f40 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
18f50 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
18f60 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
18f70 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
18f80 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
18f90 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
18fa0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
18fb0 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
18fc0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
18fd0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
18fe0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
18ff0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
19000 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
19010 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
19020 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
19030 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
19040 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
19050 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
19060 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
19070 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
19080 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
19090 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
190a0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
190b0 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
190c0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
190d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
190e0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
190f0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
19100 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
19110 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
19120 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
19130 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
19140 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
19150 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
19160 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
19170 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
19180 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
19190 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
191a0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
191b0 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
191c0 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191e0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
191f0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
19200 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
19230 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
19240 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
19250 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
19260 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
19270 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
19280 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
19290 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
192a0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
192b0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
192c0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
192d0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
192e0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
192f0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
19300 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
19310 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
19320 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
19330 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
19340 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
19350 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
19360 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
19370 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
19380 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
19390 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
193a0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
193b0 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
193c0 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
193d0 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
193e0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
193f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
19400 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
19410 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
19420 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
19430 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
19440 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
19450 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
19460 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
19470 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
19480 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54   u;.}..#if SQLIT
19490 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
194a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
194b0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
194c0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
194d0 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
194e0 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
194f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
19500 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
19510 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
19520 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
19530 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
19540 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
19550 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
19560 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
19570 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19580 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
19590 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
195a0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
195b0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
195c0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
195d0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
195e0 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
195f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
19600 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
19610 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
19620 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
19630 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
19640 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
19650 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
19660 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
19670 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
19680 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
19690 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
196a0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
196b0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
196c0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
196d0 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
196e0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
196f0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
19700 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
19710 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
19720 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
19730 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
19740 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
19750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
19760 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
19770 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
19780 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
19790 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
197a0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
197b0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
197c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
197d0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
197e0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
197f0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
19800 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
19810 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19820 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
19830 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
19840 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
19850 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19860 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
19870 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
19880 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
19890 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
198a0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
198b0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
198c0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
198d0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
198e0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
198f0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
19900 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
19910 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
19920 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
19930 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
19940 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
19950 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19960 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
19970 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
19980 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
19990 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
199a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
199b0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
199c0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
199d0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
199e0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
199f0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
19a00 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
19a10 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
19a20 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
19a30 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
19a40 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
19a50 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
19a60 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
19a70 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
19a80 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
19a90 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
19aa0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
19ab0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
19ac0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
19ad0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
19ae0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
19af0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
19b00 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
19b10 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
19b20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
19b30 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
19b40 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
19b50 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
19b60 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
19b70 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
19b80 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
19b90 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
19ba0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
19bb0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
19bc0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
19bd0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
19be0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
19bf0 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
19c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19c10 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
19c20 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
19c30 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19c40 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
19c50 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
19c60 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
19c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
19c80 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
19c90 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
19ca0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
19cb0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
19cc0 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
19cd0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
19ce0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
19cf0 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
19d00 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
19d10 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
19d20 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
19d30 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
19d40 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
19d50 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
19d60 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
19d70 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
19d80 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
19d90 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
19da0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
19db0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
19dc0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
19dd0 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
19de0 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
19df0 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
19e00 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
19e10 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
19e20 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
19e30 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
19e40 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
19e50 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
19e60 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
19e70 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
19e80 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
19e90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19ea0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
19eb0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
19ec0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
19ed0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
19ee0 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
19ef0 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
19f00 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
19f10 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
19f20 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
19f30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19f40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
19f50 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
19f60 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
19f70 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
19f80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19f90 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
19fa0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
19fb0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
19fc0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
19fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
19fe0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
19ff0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
1a000 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
1a010 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
1a020 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1a030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a040 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1a050 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1a060 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1a070 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1a080 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1a090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1a0a0 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
1a0b0 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
1a0c0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
1a0d0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
1a0e0 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72  goto debugCompar
1a0f0 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eEnd;.    }.    
1a100 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  i++;.  }while( i
1a110 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
1a120 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
1a130 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1a140 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1a150 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1a160 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1a170 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1a180 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1a190 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1a1a0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1a1b0 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1a1c0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1a1d0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1a1e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1a1f0 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
1a200 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1a210 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1a220 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1a230 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
1a240 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1a250 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1a260 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1a270 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1a280 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1a290 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1a2a0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1a2b0 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50  e.  */.  rc = pP
1a2c0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1a2d0 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45  ;..debugCompareE
1a2e0 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65  nd:.  if( desire
1a2f0 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63  dResult==0 && rc
1a300 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1a310 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1a320 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20  ult<0 && rc<0 ) 
1a330 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1a340 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20  desiredResult>0 
1a350 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e  && rc>0 ) return
1a360 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50   1;.  if( CORRUP
1a370 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b  T_DB ) return 1;
1a380 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1a390 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1a3a0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1a3b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1a3c0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  if..#if SQLITE_D
1a3d0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1a3e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1a3f0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1a400 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1a410 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1a420 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1a430 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1a440 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1a450 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1a460 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1a470 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1a480 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e  >nField + pKeyIn
1a490 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a  fo->nXField..**.
1a4a0 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1a4b0 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1a4c0 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1a4d0 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1a4e0 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1a4f0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1a500 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1a510 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1a520 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1a530 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1a540 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1a550 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1a560 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1a570 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1a580 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20  yInfo.nField or 
1a590 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
1a5a0 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1a5b0 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1a5c0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1a5d0 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1a5e0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1a5f0 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1a600 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1a610 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1a620 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1a630 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1a640 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1a650 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1a660 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1a670 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1a680 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1a690 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1a6a0 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1a6b0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1a6c0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1a6d0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1a6e0 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1a6f0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1a700 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1a710 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1a720 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1a730 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1a740 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1a750 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1a760 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1a770 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1a780 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1a790 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1a7a0 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1a7b0 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1a7c0 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1a7d0 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1a7e0 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  nXField );.}.#el
1a7f0 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1a800 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1a810 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1a820 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1a830 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1a840 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1a850 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1a860 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1a870 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1a880 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1a890 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1a8a0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1a8b0 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1a8c0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1a8d0 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1a8e0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1a8f0 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1a900 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1a910 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1a920 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1a930 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1a940 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1a950 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1a960 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1a970 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1a980 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1a990 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1a9a0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1a9b0 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1a9c0 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1a9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1a9e0 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1a9f0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1aa00 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1aa10 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1aa20 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1aa30 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1aa40 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1aa50 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1aa60 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1aa70 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1aa80 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1aa90 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1aaa0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1aab0 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1aac0 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1aad0 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1aae0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1aaf0 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1ab00 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e  *v1, *v2;.    in
1ab10 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65  t n1, n2;.    Me
1ab20 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1ab30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ab40 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1ab50 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1ab60 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1ab70 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1ab80 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1ab90 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1aba0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1abb0 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1abc0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1abd0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1abe0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1abf0 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1ac00 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1ac10 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1ac20 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1ac30 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1ac40 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30    n1 = v1==0 ? 0
1ac50 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20   : c1.n;.    v2 
1ac60 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1ac70 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1ac80 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1ac90 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32  nc);.    n2 = v2
1aca0 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a  ==0 ? 0 : c2.n;.
1acb0 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
1acc0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1acd0 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76  r, n1, v1, n2, v
1ace0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
1acf0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1ad00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1ad10 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1ad20 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d  2);.    if( (v1=
1ad30 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20  =0 || v2==0) && 
1ad40 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1ad50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ad60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ad70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1ad80 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1ad90 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1ada0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1adb0 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1adc0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1add0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1ade0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1adf0 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1ae00 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1ae10 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1ae20 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1ae30 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1ae40 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1ae50 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
1ae60 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1ae70 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1ae80 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1ae90 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1aea0 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d  .  int c = memcm
1aeb0 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a  p(pB1->z, pB2->z
1aec0 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20  , pB1->n>pB2->n 
1aed0 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e  ? pB2->n : pB1->
1aee0 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65  n);.  if( c ) re
1aef0 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e  turn c;.  return
1af00 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e   pB1->n - pB2->n
1af10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
1af20 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63  are the values c
1af30 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  ontained by the 
1af40 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  two memory cells
1af50 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e  , returning.** n
1af60 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
1af70 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65   positive if pMe
1af80 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1af90 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1afa0 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d  eater.** than pM
1afb0 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64  em2. Sorting ord
1afc0 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72  er is NULL's fir
1afd0 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  st, followed by 
1afe0 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72  numbers (integer
1aff0 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20  s.** and reals) 
1b000 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c  sorted numerical
1b010 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ly, followed by 
1b020 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20  text ordered by 
1b030 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  the collating.**
1b040 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
1b050 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  and finally blob
1b060 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
1b070 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
1b080 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1b090 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1b0a0 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
1b0b0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1b0c0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f  te3MemCompare(co
1b0d0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20  nst Mem *pMem1, 
1b0e0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1b0f0 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  , const CollSeq 
1b100 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66  *pColl){.  int f
1b110 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
1b120 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
1b130 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
1b140 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
1b150 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
1b160 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
1b170 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d  ;.  assert( (com
1b180 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
1b190 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
1b1a0 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
1b1b0 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
1b1c0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1b1d0 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
1b1e0 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
1b1f0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
1b200 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1b210 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
1b220 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
1b230 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
1b240 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
1b250 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1b260 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62   value is a numb
1b270 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  er and the other
1b280 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d   is not, the num
1b290 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ber is less..  *
1b2a0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75  * If both are nu
1b2b0 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61  mbers, compare a
1b2c0 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69  s reals if one i
1b2d0 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20  s a real, or as 
1b2e0 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66  integers.  ** if
1b2f0 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
1b300 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a   integers..  */.
1b310 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1b320 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
1b330 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64  M_Real) ){.    d
1b340 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20  ouble r1, r2;.  
1b350 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1b360 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
1b370 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1b380 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
1b390 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
1b3a0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1b3b0 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
1b3c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1b3d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1b3e0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1b3f0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1b400 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d       r1 = pMem1-
1b410 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >u.r;.    }else 
1b420 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29  if( (f1&MEM_Int)
1b430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20  !=0 ){.      r1 
1b440 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d  = (double)pMem1-
1b450 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >u.i;.    }else{
1b460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1b470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1b480 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f2&MEM_Real)!=0 
1b490 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d  ){.      r2 = pM
1b4a0 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65  em2->u.r;.    }e
1b4b0 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f  lse if( (f2&MEM_
1b4c0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1b4d0 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r2 = (double)pM
1b4e0 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65  em2->u.i;.    }e
1b4f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1b500 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
1b510 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75  if( r1<r2 ) retu
1b520 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72  rn -1;.    if( r
1b530 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b  1>r2 ) return 1;
1b540 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b550 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1b560 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
1b570 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
1b580 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
1b590 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
1b5a0 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1b5b0 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
1b5c0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1b5d0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
1b5e0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1b5f0 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
1b600 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
1b610 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1b620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1b630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b640 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
1b650 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1b660 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1b670 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1b680 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
1b690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b6a0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1b6b0 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
1b6c0 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
1b6d0 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
1b6e0 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
1b6f0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
1b700 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
1b710 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b720 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
1b730 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
1b740 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
1b750 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
1b760 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1b770 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
1b780 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
1b790 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
1b7a0 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
1b7b0 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
1b7c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1b7d0 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
1b7e0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
1b7f0 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
1b800 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1b810 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1b820 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
1b830 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
1b840 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
1b850 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
1b860 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
1b870 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
1b880 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
1b890 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
1b8a0 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
1b8b0 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
1b8c0 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
1b8d0 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
1b8e0 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
1b8f0 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
1b900 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
1b910 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
1b920 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
1b930 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1b940 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
1b950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b960 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
1b970 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
1b980 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
1b990 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
1b9a0 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
1b9b0 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
1b9c0 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
1b9d0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
1b9e0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
1b9f0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
1ba00 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
1ba10 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
1ba20 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
1ba30 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1ba40 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
1ba50 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
1ba60 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
1ba70 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
1ba80 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
1ba90 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
1baa0 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
1bab0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
1bac0 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
1bad0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
1bae0 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
1baf0 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
1bb00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1bb10 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
1bb20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
1bb30 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1bb40 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1bb50 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
1bb60 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1bb70 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
1bb80 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1bb90 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1bba0 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
1bbb0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1bbc0 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
1bbd0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1bbe0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1bbf0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1bc00 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
1bc10 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1bc20 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1bc30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
1bc40 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1bc50 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
1bc60 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1bc70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bc80 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
1bc90 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1bca0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1bcb0 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
1bcc0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1bcd0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1bce0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1bcf0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1bd00 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
1bd10 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1bd20 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1bd30 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1bd40 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
1bd50 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
1bd60 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
1bd70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1bd80 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
1bd90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1bda0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
1bdb0 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
1bdc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1bdd0 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
1bde0 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
1bdf0 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
1be00 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
1be10 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
1be20 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
1be30 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
1be40 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1be50 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
1be60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1be70 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
1be80 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
1be90 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
1bea0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
1beb0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
1bec0 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
1bed0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
1bee0 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
1bef0 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
1bf00 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
1bf10 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
1bf20 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
1bf30 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
1bf40 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
1bf50 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
1bf60 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
1bf70 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1bf80 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1bf90 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
1bfa0 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1bfb0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1bfc0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
1bfd0 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
1bfe0 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
1bff0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
1c000 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
1c010 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
1c020 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
1c030 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
1c040 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
1c050 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1c060 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
1c070 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
1c080 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1c090 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
1c0a0 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
1c0b0 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
1c0c0 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
1c0d0 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
1c0e0 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
1c0f0 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
1c100 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
1c110 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1c120 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
1c130 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
1c140 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
1c150 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
1c160 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
1c170 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1c180 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
1c190 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c1a0 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
1c1b0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1c1c0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1c1d0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c1e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c1f0 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
1c200 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1c210 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
1c240 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
1c250 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
1c260 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
1c270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c280 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1c290 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
1c2a0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
1c2b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1c2d0 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
1c2e0 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
1c2f0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1c320 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
1c330 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
1c340 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
1c350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1c360 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
1c370 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
1c380 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1c3b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
1c3c0 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
1c3d0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
1c3e0 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
1c3f0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
1c400 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1c410 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1c420 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
1c430 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1c440 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1c450 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1c460 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1c470 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
1c480 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
1c490 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1c4a0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1c4b0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
1c4c0 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1c4d0 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1c4e0 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
1c4f0 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
1c500 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
1c510 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
1c520 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
1c530 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
1c540 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
1c550 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
1c560 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
1c570 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1c580 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
1c590 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
1c5a0 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
1c5b0 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
1c5c0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1c5d0 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
1c5e0 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
1c5f0 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
1c600 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1c610 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
1c620 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
1c630 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64  if( d1>(unsigned
1c640 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20  )nKey1 ){ .     
1c650 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1c660 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1c670 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c680 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1c690 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1c6a0 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20    }.    i = 0;. 
1c6b0 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   }..  VVA_ONLY( 
1c6c0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1c6d0 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1c6e0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1c6f0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
1c700 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1c710 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1c720 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  +pPKey2->pKeyInf
1c730 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1c740 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20  y2->nField .    
1c750 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1c760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1c770 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1c780 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1c790 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1c7a0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  2->pKeyInfo->nFi
1c7b0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1c7c0 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1c7d0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1c7e0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1c7f0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1c800 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e   /* RHS is an in
1c810 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  teger */.    if(
1c820 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1c830 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
1c840 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1c850 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1c860 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1c870 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1c880 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1c890 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1c8a0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1c8b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1c8c0 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1c8d0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1c8e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1c8f0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1c900 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
1c910 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52  rhs = (double)pR
1c920 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1c930 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c940 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1c950 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1c960 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1c970 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20  f( mem1.u.r<rhs 
1c980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c990 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1c9a0 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72  lse if( mem1.u.r
1c9b0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1c9c0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1c9d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c9e0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1c9f0 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1ca00 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1ca10 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1ca20 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1ca30 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1ca40 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1ca50 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1ca60 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1ca70 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1ca80 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1ca90 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1caa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1cab0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1cac0 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1cad0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1cae0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1caf0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1cb00 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1cb10 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1cb20 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1cb30 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1cb40 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
1cb50 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
1cb60 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
1cb70 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
1cb80 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
1cb90 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
1cba0 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
1cbb0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
1cbc0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
1cbd0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
1cbe0 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
1cbf0 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
1cc00 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
1cc10 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
1cc20 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
1cc30 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
1cc40 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1cc50 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1cc60 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1cc70 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1cc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cc90 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68  double rhs = pRh
1cca0 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20  s->u.r;.        
1ccb0 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20  double lhs;.    
1ccc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1ccd0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1cce0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1ccf0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1cd00 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1cd10 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1cd20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72    lhs = mem1.u.r
1cd30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1cd40 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1cd50 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e   (double)mem1.u.
1cd60 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
1cd70 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1cd80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1cd90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1cda0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1cdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1cdc0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1cdd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1cde0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1cdf0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1ce00 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1ce10 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1ce20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ce30 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1ce40 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ce50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1ce60 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1ce70 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ce80 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1ce90 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1cea0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1ceb0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1cec0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1ced0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1cee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1cef0 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1cf00 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1cf10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cf20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1cf30 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1cf40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1cf50 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1cf60 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1cf70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1cf80 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1cf90 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1cfa0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1cfb0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1cfc0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1cfd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1cfe0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cff0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1d000 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1d010 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1d020 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1d030 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1d040 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1d050 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1d060 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1d070 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1d080 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1d090 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1d0a0 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1d0b0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1d0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1d0d0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1d0e0 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1d0f0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1d100 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1d110 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1d120 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1d130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d140 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1d150 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1d160 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1d170 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1d180 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1d190 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1d1a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1d1b0 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1d1c0 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1d1d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d1e0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1d1f0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1d200 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1d210 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1d220 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1d230 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1d240 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1d250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d260 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1d270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1d280 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1d290 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1d2a0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1d2b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1d2c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1d2d0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1d2e0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1d2f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d300 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1d310 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1d320 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d330 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1d340 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1d350 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1d360 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1d370 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1d380 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1d390 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1d3a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1d3c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d3d0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1d3e0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1d3f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1d400 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1d410 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1d420 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1d430 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1d440 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1d450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d460 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1d470 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1d480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d490 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1d4a0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1d4b0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1d4c0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1d4d0 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1d4e0 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1d4f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d500 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1d510 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1d520 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1d530 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1d540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1d550 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1d560 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1d570 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d580 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1d590 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1d5a0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1d5b0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1d5c0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1d5d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1d5e0 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1d5f0 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1d600 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1d610 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1d620 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1d630 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1d640 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1d650 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1d660 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1d670 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1d680 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1d690 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1d6a0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1d6b0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1d6c0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1d6d0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1d6e0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1d6f0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1d700 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1d710 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1d720 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1d730 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1d740 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1d750 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1d760 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1d770 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1d780 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1d790 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1d7a0 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1d7b0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1d7c0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1d7d0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1d7e0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1d7f0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1d800 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1d810 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1d820 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1d830 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1d840 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1d850 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1d860 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1d870 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1d880 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1d890 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1d8a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1d8b0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50    );.  return pP
1d8c0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1d8d0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1d8e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d8f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1d900 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1d910 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1d920 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1d930 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1d940 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1d950 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1d960 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1d970 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1d980 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1d990 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
1d9a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d9b0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1d9c0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1d9d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d9e0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1d9f0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1da00 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1da10 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1da20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
1da30 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1da40 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
1da50 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1da60 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1da70 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
1da80 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
1da90 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
1daa0 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
1dab0 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
1dac0 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
1dad0 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
1dae0 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
1daf0 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
1db00 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
1db10 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
1db20 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
1db30 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1db40 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
1db50 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1db60 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1db70 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1db80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1db90 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1dba0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1dbb0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1dbc0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1dbd0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1dbe0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1dbf0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1dc00 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1dc10 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1dc20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1dc30 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1dc40 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1dc50 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1dc60 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1dc70 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1dc80 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1dc90 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1dca0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
1dcb0 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
1dcc0 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
1dcd0 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
1dce0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1dcf0 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1dd00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1dd10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1dd20 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1dd30 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1dd40 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1dd50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1dd60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1dd70 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1dd80 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1dd90 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1dda0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1ddb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1ddc0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1ddd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dde0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1ddf0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1de00 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1de10 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1de20 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1de30 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1de40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1de50 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1de60 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1de70 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1de80 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1de90 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1dea0 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1deb0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1dec0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1ded0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1dee0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1def0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1df00 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1df10 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1df20 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1df30 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1df40 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1df50 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1df60 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1df70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1df80 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
1df90 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1dfa0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1dfb0 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
1dfc0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1dfd0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1dfe0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1dff0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
1e000 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
1e010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1e020 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1e030 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e040 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
1e050 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
1e060 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
1e070 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
1e080 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1e090 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
1e0a0 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
1e0b0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
1e0c0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
1e0d0 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
1e0e0 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
1e0f0 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
1e100 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
1e110 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
1e120 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
1e130 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
1e140 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
1e150 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
1e160 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
1e170 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
1e180 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
1e190 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
1e1a0 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
1e1b0 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
1e1c0 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
1e1d0 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
1e1e0 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
1e1f0 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
1e200 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
1e210 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
1e220 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
1e230 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
1e240 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1e250 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1e260 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1e270 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
1e280 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1e290 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e2a0 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1e2b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
1e2c0 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73    }..  if( v>lhs
1e2d0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1e2e0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
1e2f0 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
1e300 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1e310 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
1e320 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
1e330 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
1e340 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1e350 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
1e360 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
1e370 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
1e380 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
1e390 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
1e3a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e3b0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1e3c0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1e3d0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1e3e0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1e3f0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1e400 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1e410 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
1e420 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
1e430 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
1e440 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1e450 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
1e460 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
1e470 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1e480 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
1e490 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1e4a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1e4b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1e4c0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  es) );.  return 
1e4d0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
1e4e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e4f0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1e500 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1e510 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e520 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1e530 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1e540 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
1e550 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
1e560 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
1e570 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
1e580 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
1e590 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
1e5a0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
1e5b0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
1e5c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1e5d0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1e5e0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1e5f0 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
1e600 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1e610 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
1e620 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1e630 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1e640 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1e650 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1e660 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1e670 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1e680 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1e690 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1e6a0 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1e6b0 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1e6c0 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
1e6d0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1e6e0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
1e6f0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
1e700 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
1e710 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1e720 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1e730 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1e740 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
1e750 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
1e760 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
1e770 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
1e780 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
1e790 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1e7a0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
1e7b0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1e7c0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
1e7d0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
1e7e0 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
1e7f0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
1e800 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
1e810 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
1e820 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
1e830 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
1e840 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
1e850 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
1e860 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
1e870 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1e880 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1e890 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e8a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1e8b0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1e8c0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
1e8d0 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
1e8e0 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
1e8f0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
1e900 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
1e910 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
1e920 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
1e930 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1e940 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
1e950 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
1e960 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
1e970 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1e980 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
1e990 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
1e9a0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1e9b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1e9c0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1e9d0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1e9e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
1e9f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
1ea00 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1ea10 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20  ult_rc;.        
1ea20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1ea30 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
1ea40 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1ea50 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r2;.      }else
1ea60 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1ea70 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
1ea80 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1ea90 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
1eaa0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1eab0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1eac0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1ead0 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ->r1;.    }.  }.
1eae0 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
1eaf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1eb00 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1eb10 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20  pPKey2, res).   
1eb20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1eb30 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65  B.       || pPKe
1eb40 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1eb50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1eb60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1eb70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1eb80 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1eb90 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1eba0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
1ebb0 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
1ebc0 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
1ebd0 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
1ebe0 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
1ebf0 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
1ec00 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
1ec10 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
1ec20 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
1ec30 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
1ec40 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
1ec50 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
1ec60 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
1ec70 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1ec80 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
1ec90 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
1eca0 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
1ecb0 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
1ecc0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
1ecd0 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
1ece0 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1ecf0 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
1ed00 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1ed10 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
1ed20 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
1ed30 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1ed40 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
1ed50 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
1ed60 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
1ed70 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
1ed80 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
1ed90 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
1eda0 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
1edb0 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
1edc0 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
1edd0 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
1ede0 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
1edf0 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
1ee00 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
1ee10 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
1ee20 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
1ee30 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
1ee40 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1ee50 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
1ee60 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
1ee70 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
1ee80 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
1ee90 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
1eea0 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
1eeb0 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
1eec0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
1eed0 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
1eee0 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
1eef0 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
1ef00 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
1ef10 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
1ef20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
1ef30 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
1ef40 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
1ef50 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
1ef60 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
1ef70 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
1ef80 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
1ef90 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  es.  */.  if( (p
1efa0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1efb0 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  ld + p->pKeyInfo
1efc0 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29  ->nXField)<=13 )
1efd0 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
1efe0 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
1eff0 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
1f000 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1f010 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
1f020 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
1f030 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
1f040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
1f050 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
1f060 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
1f070 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1f080 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
1f090 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1f0a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
1f0b0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1f0c0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1f0d0 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
1f0e0 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1f0f0 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
1f100 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1f110 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
1f120 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
1f130 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
1f140 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
1f150 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
1f160 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
1f170 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
1f180 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
1f190 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1f1a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1f1b0 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
1f1c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f1d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f1e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
1f1f0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
1f200 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
1f210 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
1f220 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1f230 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
1f240 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
1f250 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
1f260 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
1f270 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
1f280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1f290 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
1f2a0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
1f2b0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1f2c0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
1f2d0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
1f2e0 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
1f2f0 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
1f300 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
1f310 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
1f320 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
1f330 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
1f340 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
1f350 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
1f360 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
1f370 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
1f380 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f390 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
1f3a0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1f3b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
1f3c0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
1f3d0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
1f3e0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
1f3f0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
1f400 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
1f410 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
1f420 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
1f430 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
1f440 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
1f450 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
1f460 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
1f470 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
1f480 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
1f490 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
1f4a0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
1f4b0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
1f4c0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
1f4d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1f4e0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
1f4f0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
1f500 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
1f510 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
1f520 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
1f530 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
1f540 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
1f550 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
1f560 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
1f570 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1f580 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1f590 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
1f5a0 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
1f5b0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
1f5c0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
1f5d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1f5e0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f  LITE_OK );     /
1f5f0 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1f600 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1f610 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1f620 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
1f630 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
1f640 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
1f650 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
1f660 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
1f670 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
1f680 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
1f690 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
1f6a0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
1f6b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1f6c0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1f6d0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
1f6e0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
1f6f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1f700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1f710 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
1f720 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
1f730 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
1f740 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
1f750 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
1f760 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
1f770 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1f780 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
1f790 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
1f7a0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
1f7b0 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
1f7c0 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
1f7d0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1f7e0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1f7f0 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
1f800 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
1f810 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
1f820 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
1f830 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
1f840 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
1f850 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
1f860 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
1f870 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
1f880 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
1f890 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
1f8a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f8b0 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
1f8c0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f8d0 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
1f8e0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f8f0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1f900 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
1f910 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f920 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
1f930 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f940 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
1f950 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f960 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
1f970 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
1f980 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1f990 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
1f9a0 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
1f9b0 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
1f9c0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1f9d0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1f9e0 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
1f9f0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1fa00 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b  izes[typeRowid];
1fa10 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
1fa20 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
1fa30 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
1fa40 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
1fa50 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
1fa60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1fa70 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1fa80 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
1fa90 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
1faa0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
1fab0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
1fac0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
1fad0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
1fae0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
1faf0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
1fb00 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
1fb10 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
1fb20 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
1fb30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fb40 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1fb50 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
1fb60 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1fb70 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
1fb80 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
1fb90 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
1fba0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
1fbb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fbc0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
1fbd0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
1fbe0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a    testcase( m.sz
1fbf0 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
1fc00 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1fc10 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1fc20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1fc30 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
1fc40 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
1fc50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1fc60 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1fc70 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
1fc80 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
1fc90 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
1fca0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
1fcb0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
1fcc0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
1fcd0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1fce0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1fcf0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
1fd00 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
1fd10 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
1fd20 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
1fd30 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1fd40 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
1fd50 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
1fd60 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
1fd70 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
1fd80 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
1fd90 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
1fda0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1fdb0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
1fdc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1fdd0 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
1fde0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
1fdf0 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
1fe00 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
1fe10 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
1fe20 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
1fe30 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
1fe40 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
1fe50 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
1fe60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1fe70 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
1fe80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1feb0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1fec0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
1fef0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
1ff00 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
1ff10 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
1ff20 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63  ,       /* Unpac
1ff30 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
1ff40 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  ey */.  int *res
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1ff70 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1ff80 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
1ff90 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
1ffa0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
1ffb0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1ffc0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
1ffd0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
1ffe0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1fff0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
20000 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
20010 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
20020 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
20030 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
20040 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20050 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
20060 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
20070 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
20080 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
20090 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
200a0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
200b0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
200c0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
200d0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
200e0 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
200f0 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
20100 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
20110 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
20120 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
20130 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
20140 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
20150 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
20160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20170 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20180 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
20190 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
201a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
201b0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
201c0 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
201d0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
201e0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
201f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
20200 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
20210 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20220 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
20230 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
20240 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
20250 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
20260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20270 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20280 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
20290 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
202a0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
202b0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
202c0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
202d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
202e0 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
202f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
20300 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
20310 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
20320 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
20330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20340 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
20350 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
20360 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
20370 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
20380 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
20390 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
203a0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
203b0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
203c0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
203d0 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
203e0 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
203f0 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
20400 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
20410 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
20420 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
20430 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
20440 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
20450 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
20460 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20470 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
20480 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
20490 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
204a0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
204b0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
204c0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
204d0 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
204e0 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
204f0 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
20500 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
20510 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
20520 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
20530 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
20540 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
20550 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
20560 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
20570 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
20580 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
20590 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
205a0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
205b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
205c0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
205d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
205e0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
205f0 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
20600 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
20610 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
20620 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
20630 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
20640 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
20650 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
20660 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
20670 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
20680 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
20690 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
206a0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
206b0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
206c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
206d0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
206e0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
206f0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
20700 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
20710 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
20720 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
20730 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
20740 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
20750 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
20760 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
20770 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
20780 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
20790 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
207a0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
207b0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
207c0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
207d0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
207e0 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
207f0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
20800 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
20810 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
20820 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
20830 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
20840 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
20850 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
20860 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
20870 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
20880 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
20890 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
208a0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
208b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
208c0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
208d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
208e0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
208f0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
20900 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
20910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20920 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
20930 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
20940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
20950 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
20960 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
20970 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
20980 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
20990 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
209a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
209b0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
209c0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
209d0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
209e0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
209f0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
20a00 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
20a10 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
20a20 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
20a30 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
20a40 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
20a50 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
20a60 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
20a70 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
20a80 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
20a90 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
20aa0 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
20ab0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
20ac0 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
20ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
20ae0 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
20af0 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
20b00 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
20b10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
20b20 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
20b30 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
20b40 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
20b50 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
20b60 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
20b70 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
20b80 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
20b90 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
20ba0 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
20bb0 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
20bc0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
20bd0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
20be0 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
20bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
20c00 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
20c10 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
20c20 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
20c30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
20c40 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
20c50 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
20c60 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
20c70 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
20c80 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
20c90 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
20ca0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
20cb0 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
20cc0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
20cd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20ce0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
20cf0 4c 45 20 2a 2f 0a                                LE */.