/ Hex Artifact Content
Login

Artifact 13261b7597c7f189232f84a1e175a3268ea2c32b:


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 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16610 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
16620 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
16630 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
16640 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
16650 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
16660 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16670 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
16680 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
16690 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
166a0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
166b0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
166c0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
166d0 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
166e0 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
166f0 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
16700 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
16710 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
16720 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
16730 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
16740 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
16750 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
16760 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
16770 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
16780 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
16790 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
167a0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
167b0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
167c0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
167d0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
167e0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
167f0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
16800 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
16810 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
16820 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
16830 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
16840 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
16850 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
16860 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
16870 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
16880 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
16890 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
168a0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
168b0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
168c0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
168d0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
168e0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
168f0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
16900 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
16910 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
16920 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
16930 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
16940 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
16950 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
16960 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
16970 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
16980 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
16990 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
169a0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
169b0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
169c0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
169d0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
169e0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
169f0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
16a00 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
16a10 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
16a20 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
16a30 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
16a40 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
16a50 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
16a60 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
16a70 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
16a80 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
16a90 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
16aa0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
16ab0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
16ac0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
16ad0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
16ae0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
16af0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
16b00 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
16b10 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
16b20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
16b30 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
16b40 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
16b50 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
16b60 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
16b70 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
16b80 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
16b90 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
16ba0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
16bb0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
16bc0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
16bd0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
16be0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
16bf0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
16c00 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
16c10 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
16c20 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
16c30 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
16c40 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
16c50 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
16c60 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
16c70 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
16c80 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
16c90 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
16ca0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
16cb0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
16cc0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
16cd0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
16ce0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
16cf0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
16d00 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
16d10 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
16d20 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
16d30 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
16d40 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
16d50 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
16d60 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
16d70 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
16d80 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
16d90 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
16da0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
16db0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
16dc0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16dd0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16de0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
16df0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
16e00 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
16e10 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
16e20 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
16e30 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
16e40 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
16e50 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
16e60 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
16e70 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
16e80 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
16e90 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
16ea0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
16eb0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16ec0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16ed0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
16ee0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
16ef0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
16f00 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
16f10 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
16f20 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
16f30 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16f40 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
16f50 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
16f60 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
16f70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16f80 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
16f90 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
16fa0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
16fb0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
16fc0 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
16fd0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
16fe0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
16ff0 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
17000 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
17010 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
17020 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
17030 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
17040 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
17050 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
17060 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17070 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17080 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
17090 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
170a0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
170b0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
170c0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
170d0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
170e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
170f0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
17100 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
17110 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
17120 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
17130 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
17140 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
17150 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
17160 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
17170 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
17180 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
17190 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
171a0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
171b0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
171c0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
171d0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
171e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
171f0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
17200 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
17210 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
17220 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
17230 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
17240 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
17250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17260 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
17270 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
17280 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
17290 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
172a0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
172b0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
172c0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
172d0 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
172e0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
172f0 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
17300 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
17310 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
17320 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
17330 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
17340 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
17350 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
17360 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
17370 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
17380 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
17390 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
173a0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
173b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
173c0 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
173d0 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
173e0 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
173f0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
17400 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
17410 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
17420 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
17430 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
17440 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
17450 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
17460 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
17470 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
17480 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
17490 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
174a0 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
174b0 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
174c0 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
174d0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
174e0 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
174f0 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
17500 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
17510 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
17520 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
17530 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
17540 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
17550 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
17560 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
17570 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
17580 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
17590 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
175a0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
175b0 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
175c0 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
175d0 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
175e0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
175f0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
17600 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
17610 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
17620 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
17630 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
17640 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
17650 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
17660 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
17670 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
17680 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17690 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
176a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
176b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
176c0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
176d0 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
176e0 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
176f0 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
17700 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
17710 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
17720 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
17730 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
17740 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
17750 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
17760 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
17770 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
17780 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
17790 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f  atic u32 SQLITE_
177a0 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47  NOINLINE serialG
177b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
177c0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
177d0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
177e0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
177f0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
17800 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
17810 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
17820 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
17830 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
17840 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
17850 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
17860 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
17870 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
17880 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
17890 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
178a0 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
178b0 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
178c0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
178d0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
178e0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a  ype==6 ){.    /*
178f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17900 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75  29851-52272 Valu
17910 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
17920 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  n 64-bit.    ** 
17930 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
17940 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
17950 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
17960 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
17970 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17980 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17990 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
179a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
179b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
179c0 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20  343-49114 Value 
179d0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
179e0 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34  IEEE 754-2008 64
179f0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61  -bit.    ** floa
17a00 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
17a10 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  r. */.#if !defin
17a20 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
17a30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17a40 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
17a50 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
17a60 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
17a70 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
17a80 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
17a90 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
17aa0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
17ab0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
17ac0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
17ad0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
17ae0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
17af0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
17b00 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
17b10 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
17b20 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
17b30 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
17b40 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
17b50 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
17b60 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
17b70 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
17b80 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
17b90 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
17ba0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
17bb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
17bc0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
17bd0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
17be0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
17bf0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
17c00 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
17c10 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
17c20 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
17c30 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
17c40 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
17c50 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
17c60 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
17c70 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
17c80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
17c90 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
17ca0 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  u.r) ? MEM_Null 
17cb0 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a  : MEM_Real;.  }.
17cc0 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33    return 8;.}.u3
17cd0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17ce0 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
17cf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
17d00 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
17d10 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
17d20 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
17d30 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
17d40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
17d50 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
17d60 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
17d70 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
17d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
17d90 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
17da0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
17db0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
17dc0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
17dd0 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
17de0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
17df0 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
17e00 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
17e10 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
17e20 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
17e30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a  : {  /* Null */.
17e40 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
17e50 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39  E-OF: R-24078-09
17e60 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e  375 Value is a N
17e70 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ULL. */.      pM
17e80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17e90 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
17ea0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17eb0 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  e 1: {.      /* 
17ec0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
17ed0 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65  4885-25196 Value
17ee0 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f   is an 8-bit two
17ef0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20  s-complement.   
17f00 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a     ** integer. *
17f10 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17f20 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  i = ONE_BYTE_INT
17f30 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
17f40 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17f50 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17f60 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17f70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17f80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
17f90 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
17fa0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
17fb0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
17fc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34  ENCE-OF: R-49794
17fd0 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20  -35026 Value is 
17fe0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d  a big-endian 16-
17ff0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
18000 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
18010 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
18020 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42  Mem->u.i = TWO_B
18030 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
18040 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
18050 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18060 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
18070 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
18080 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
18090 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
180a0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
180b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
180c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
180d0 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61  R-37839-54301 Va
180e0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
180f0 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20  ian 24-bit.     
18100 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
18110 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
18120 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
18130 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
18140 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
18150 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
18160 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
18170 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
18180 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18190 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
181a0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
181b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
181c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
181d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39  ENCE-OF: R-01849
181e0 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20  -26079 Value is 
181f0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d  a big-endian 32-
18200 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
18210 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
18220 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
18230 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
18240 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
18250 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
18260 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
18270 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
18280 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
18290 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
182a0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
182b0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
182c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
182d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
182e0 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56   R-50385-09674 V
182f0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
18300 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20  dian 48-bit.    
18310 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
18320 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
18330 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
18340 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
18350 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
18360 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
18370 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
18380 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
18390 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
183a0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
183b0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
183c0 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
183d0 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
183e0 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
183f0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
18400 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
18410 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
18420 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20  .      /* These 
18430 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  use local variab
18440 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20  les, so do them 
18450 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f  in a separate ro
18460 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74  utine.      ** t
18470 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
18480 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65  o move the frame
18490 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
184a0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
184b0 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69       return seri
184c0 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c  alGet(buf,serial
184d0 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20  _type,pMem);.   
184e0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
184f0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
18500 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
18510 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
18520 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
18530 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32  CE-OF: R-12976-2
18540 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68  2893 Value is th
18550 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a  e integer 0. */.
18560 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18570 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32  E-OF: R-18143-12
18580 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65  121 Value is the
18590 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20   integer 1. */. 
185a0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
185b0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
185c0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
185d0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
185e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
185f0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
18600 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
18610 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d  NCE-OF: R-14606-
18620 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61  31564 Value is a
18630 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e   BLOB that is (N
18640 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a  -12)/2 bytes in.
18650 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e        ** length.
18660 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
18670 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30  CE-OF: R-28401-0
18680 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20  0140 Value is a 
18690 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65  string in the te
186a0 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a  xt encoding and.
186b0 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f        ** (N-13)/
186c0 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
186d0 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  h. */.      stat
186e0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
186f0 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
18700 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
18710 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
18720 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
18730 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
18740 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
18750 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
18760 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  2;.      pMem->f
18770 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
18780 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
18790 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e     return pMem->
187a0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
187b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn 0;.}./*.**
187c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
187d0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
187e0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
187f0 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
18800 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
18810 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
18820 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
18830 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
18840 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
18850 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
18860 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
18870 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
18880 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
18890 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
188a0 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
188b0 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
188c0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
188d0 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
188e0 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
188f0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
18900 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
18910 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
18920 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
18930 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
18940 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
18950 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
18960 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
18970 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
18980 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
18990 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
189a0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
189b0 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
189c0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
189d0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
189e0 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
189f0 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
18a00 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
18a10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18a20 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
18a30 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
18a40 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
18a50 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
18a60 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
18a70 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
18a80 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
18a90 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
18aa0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
18ab0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
18ac0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
18ad0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
18ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
18af0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
18b00 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
18b10 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
18b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b30 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
18b40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
18b50 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b70 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
18b80 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
18b90 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
18ba0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18bc0 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
18bd0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
18be0 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
18c10 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
18c20 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
18c30 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c50 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18c60 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
18c70 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
18c80 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
18c90 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
18ca0 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
18cb0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
18cc0 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
18cd0 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
18ce0 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
18cf0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
18d00 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
18d10 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
18d20 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
18d30 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
18d40 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
18d50 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
18d60 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
18d70 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
18d80 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
18d90 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
18da0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
18db0 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
18dc0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
18dd0 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
18de0 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
18df0 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
18e00 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
18e10 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
18e20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
18e30 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
18e40 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
18e50 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
18e60 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
18e70 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
18e80 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
18e90 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
18ea0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
18eb0 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
18ec0 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
18ed0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
18ee0 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
18ef0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
18f00 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
18f10 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
18f20 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
18f30 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
18f40 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
18f50 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
18f60 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
18f70 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
18f80 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
18f90 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
18fa0 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
18fb0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
18fc0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
18fd0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
18fe0 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
18ff0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
19000 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
19010 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
19020 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
19030 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
19040 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
19050 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
19060 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
19070 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19090 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
190a0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
190b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
190c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
190d0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
190e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
190f0 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
19100 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
19110 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
19120 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
19130 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19140 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
19150 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
19160 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
19170 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19190 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
191a0 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
191b0 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
191e0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
191f0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
19200 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
19210 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
19220 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
19230 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19240 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
19250 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
19260 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
19270 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
19280 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
19290 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
192a0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
192b0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
192c0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
192d0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
192e0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
192f0 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
19300 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
19310 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
19320 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
19330 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
19340 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
19350 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19360 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
19370 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
19380 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
19390 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
193a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
193b0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
193c0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
193d0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
193e0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
193f0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
19400 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
19410 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
19420 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
19430 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51  d = u;.}..#if SQ
19440 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
19450 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
19460 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
19470 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
19480 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
19490 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
194a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
194b0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
194c0 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
194d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
194e0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
194f0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
19500 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
19510 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
19520 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19530 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
19540 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
19550 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
19560 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
19570 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
19580 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
19590 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
195a0 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
195b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
195c0 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
195d0 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
195e0 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
195f0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
19600 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
19610 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
19620 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
19630 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
19640 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
19650 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
19660 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
19670 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
19680 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
19690 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
196a0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
196b0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
196c0 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
196d0 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
196e0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
196f0 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
19700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19710 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
19720 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
19730 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
19740 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
19750 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
19760 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
19770 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
19780 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
19790 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
197a0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
197b0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
197c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
197d0 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
197e0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
197f0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
19800 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19810 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
19820 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19830 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
19840 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
19850 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
19860 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
19870 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
19880 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
19890 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
198a0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
198b0 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
198c0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
198d0 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
198e0 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
198f0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
19900 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
19910 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
19920 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
19930 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
19940 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
19950 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
19960 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
19970 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
19980 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
19990 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
199a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
199b0 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
199c0 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
199d0 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
199e0 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
199f0 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
19a00 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
19a10 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
19a20 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
19a30 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
19a40 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
19a50 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
19a60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
19a70 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
19a80 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
19a90 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
19aa0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
19ab0 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
19ac0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
19ad0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
19ae0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
19af0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
19b00 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
19b10 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
19b20 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
19b30 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
19b40 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
19b50 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
19b60 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
19b70 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
19b80 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
19b90 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
19ba0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
19bb0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19bc0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
19bd0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
19be0 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
19bf0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
19c00 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
19c10 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
19c20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
19c30 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
19c40 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
19c50 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
19c60 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
19c70 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
19c80 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
19c90 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
19ca0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
19cb0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
19cc0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
19cd0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
19ce0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
19cf0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
19d00 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
19d10 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
19d20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
19d30 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
19d40 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
19d50 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
19d60 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
19d70 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
19d80 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
19d90 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
19da0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
19db0 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
19dc0 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
19dd0 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
19de0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
19df0 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
19e00 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
19e10 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
19e20 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19e30 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
19e40 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
19e50 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
19e60 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
19e70 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
19e80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
19e90 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
19ea0 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
19eb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
19ec0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19ed0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
19ee0 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
19ef0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
19f00 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
19f10 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
19f20 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
19f30 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
19f40 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
19f50 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
19f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19f70 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
19f80 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
19f90 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
19fa0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
19fb0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
19fc0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
19fd0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
19fe0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
19ff0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1a000 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1a010 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1a020 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1a030 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1a040 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1a050 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1a060 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1a070 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1a080 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1a090 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1a0a0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1a0b0 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1a0c0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1a0d0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1a0e0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1a0f0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1a100 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1a110 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1a120 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1a130 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1a140 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1a150 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1a160 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1a170 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1a180 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1a190 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1a1a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1a1b0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1a1c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1a1d0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1a1e0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1a1f0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1a200 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1a210 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1a220 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1a230 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1a240 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1a250 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1a260 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1a270 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1a280 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1a290 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1a2a0 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1a2b0 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1a2c0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1a2d0 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1a2e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1a2f0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1a300 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1a310 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1a320 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1a330 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1a340 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
1a350 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1a360 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1a370 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1a380 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1a390 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1a3a0 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1a3b0 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1a3c0 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1a3d0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1a3e0 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1a3f0 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1a400 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1a410 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1a420 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1a430 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1a440 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1a450 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1a460 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1a470 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1a480 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1a490 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1a4a0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1a4b0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1a4c0 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1a4d0 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1a4e0 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1a4f0 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1a500 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1a510 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1a520 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1a530 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1a540 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1a550 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1a560 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1a570 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1a580 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1a590 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1a5a0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1a5b0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1a5c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1a5d0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1a5e0 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1a5f0 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1a600 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1a610 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1a620 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1a630 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1a640 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a650 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1a660 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1a670 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1a680 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1a690 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1a6a0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1a6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1a6c0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1a6d0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1a6e0 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1a6f0 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1a700 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1a710 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1a720 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1a730 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1a740 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1a750 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1a760 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1a770 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1a780 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1a790 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1a7a0 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1a7b0 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1a7c0 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1a7d0 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1a7e0 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1a7f0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1a800 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1a810 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1a820 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1a830 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1a840 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1a850 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1a860 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1a870 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1a880 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1a890 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1a8a0 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1a8b0 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1a8c0 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1a8d0 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1a8e0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1a8f0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1a900 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1a910 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1a920 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1a930 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1a940 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1a970 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1a980 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1a990 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1a9a0 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1a9b0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1a9c0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1a9d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1a9e0 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1a9f0 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1aa00 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1aa10 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1aa20 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1aa30 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1aa40 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1aa50 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1aa60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1aa70 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1aa80 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1aa90 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1aaa0 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1aab0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1aac0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1aad0 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1aae0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1aaf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1ab00 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1ab10 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1ab20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1ab30 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1ab40 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1ab50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ab60 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1ab70 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1ab80 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1ab90 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1aba0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1abb0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1abc0 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1abd0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1abe0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1abf0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1ac00 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1ac10 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1ac20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1ac30 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1ac40 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1ac50 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1ac60 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
1ac70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1ac80 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1ac90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1aca0 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69  ease(&c2);.    i
1acb0 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1acc0 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1acd0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1ace0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1acf0 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1ad00 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1ad10 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1ad20 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1ad30 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1ad40 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1ad50 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1ad60 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1ad70 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1ad80 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1ad90 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1ada0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1adb0 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1adc0 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1add0 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1ade0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1adf0 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1ae00 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1ae10 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1ae20 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20   *pB2){.  int c 
1ae30 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1ae40 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e   pB2->z, pB1->n>
1ae50 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20  pB2->n ? pB2->n 
1ae60 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28  : pB1->n);.  if(
1ae70 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1ae80 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d   return pB1->n -
1ae90 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a   pB2->n;.}.../*.
1aea0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1aeb0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1aec0 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1aed0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1aee0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1aef0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1af00 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1af10 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1af20 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1af30 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1af40 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1af50 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1af60 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1af70 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1af80 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1af90 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1afa0 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1afb0 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1afc0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1afd0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1afe0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1aff0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1b000 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1b010 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1b020 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1b030 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1b040 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1b050 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1b060 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1b070 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1b080 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1b090 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1b0a0 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1b0b0 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1b0c0 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1b0d0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1b0e0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1b0f0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1b100 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1b110 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1b120 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1b130 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1b140 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1b150 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1b160 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1b170 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1b180 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1b190 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b1a0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1b1b0 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1b1c0 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1b1d0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1b1e0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1b1f0 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
1b200 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
1b210 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
1b220 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1b230 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
1b240 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
1b250 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
1b260 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
1b270 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
1b280 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
1b290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1b2a0 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1b2b0 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1b2c0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c  {.    double r1,
1b2d0 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31   r2;.    if( (f1
1b2e0 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1b2f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1b300 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1b310 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1b320 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1b330 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1b340 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1b350 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1b360 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1b370 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1b380 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  =0 ){.      r1 =
1b390 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20   pMem1->u.r;.   
1b3a0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d   }else if( (f1&M
1b3b0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1b3c0 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65      r1 = (double
1b3d0 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20  )pMem1->u.i;.   
1b3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1b3f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b400 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1b410 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1b420 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b  r2 = pMem2->u.r;
1b430 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1b440 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1b450 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f  {.      r2 = (do
1b460 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b  uble)pMem2->u.i;
1b470 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b480 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1b490 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32   }.    if( r1<r2
1b4a0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1b4b0 20 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65    if( r1>r2 ) re
1b4c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
1b4d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1b4e0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1b4f0 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1b500 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1b510 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1b520 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1b530 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1b540 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1b550 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1b560 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1b570 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b580 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1b590 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1b5a0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1b5b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b5c0 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1b5d0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1b5e0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1b5f0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1b600 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1b610 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73  2->enc );.    as
1b620 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1b630 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1b640 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1b650 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1b660 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1b670 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1b680 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1b690 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1b6a0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1b6b0 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1b6c0 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1b6d0 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1b6e0 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1b6f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1b700 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1b710 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1b720 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1b730 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1b740 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1b750 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1b760 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1b770 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1b780 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1b790 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1b7a0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1b7b0 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1b7c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1b7d0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1b7e0 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1b7f0 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1b800 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1b810 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1b820 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1b830 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1b840 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1b850 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1b860 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1b870 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1b880 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1b890 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1b8a0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1b8b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1b8c0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1b8d0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b8e0 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1b8f0 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1b900 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1b910 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1b920 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1b930 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1b940 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1b950 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1b960 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1b970 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1b980 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1b990 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1b9a0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1b9b0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b9c0 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1b9d0 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1b9e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1b9f0 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1ba00 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1ba10 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1ba20 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1ba30 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1ba40 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1ba50 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1ba60 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1ba70 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1ba80 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1ba90 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1baa0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1bab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bac0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1bad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1bae0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1baf0 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1bb00 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1bb10 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1bb20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1bb30 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1bb40 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1bb50 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1bb60 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1bb70 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1bb80 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1bb90 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1bba0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1bbb0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1bbc0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1bbd0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1bbe0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1bbf0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1bc00 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1bc10 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1bc20 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1bc30 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1bc40 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1bc50 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1bc60 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1bc70 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1bc80 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1bc90 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1bca0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1bcb0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1bcc0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1bcd0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1bce0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bcf0 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1bd00 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1bd10 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1bd20 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1bd30 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1bd40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1bd50 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1bd60 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1bd70 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1bd80 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1bd90 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1bda0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1bdb0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1bdc0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1bdd0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1bde0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1bdf0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1be00 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1be10 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1be20 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1be30 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1be40 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1be50 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1be60 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1be70 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1be80 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1be90 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1bea0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1beb0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1bec0 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1bed0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1bee0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1bef0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1bf00 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1bf10 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1bf20 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1bf30 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1bf40 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1bf50 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1bf60 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1bf70 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1bf80 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1bf90 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1bfa0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1bfb0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1bfc0 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1bfd0 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1bfe0 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1bff0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1c000 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1c010 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1c020 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1c030 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1c040 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1c050 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1c060 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1c070 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1c080 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1c090 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1c0a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1c0b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1c0c0 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1c0d0 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1c0e0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1c0f0 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1c100 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1c110 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1c120 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1c130 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1c140 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1c150 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1c160 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1c170 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1c180 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1c190 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1c1a0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1c1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c1c0 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1c1d0 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1c1e0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1c210 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1c220 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1c230 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1c260 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1c270 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1c280 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1c290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c2a0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1c2b0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1c2c0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1c2f0 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1c300 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1c310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c320 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c330 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1c340 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1c350 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1c360 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1c370 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1c380 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1c390 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1c3a0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1c3b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c3c0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1c3d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c3e0 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1c3f0 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1c400 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1c410 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1c420 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1c430 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1c440 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1c450 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1c460 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1c470 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1c480 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1c490 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1c4a0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1c4b0 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1c4c0 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1c4d0 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1c4e0 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1c4f0 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1c500 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1c510 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1c520 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1c530 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1c540 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1c550 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1c560 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1c570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c580 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1c590 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1c5a0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1c5b0 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1c5c0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1c5d0 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1c5e0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1c5f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c600 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1c610 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1c620 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1c630 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1c640 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1c650 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1c660 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1c670 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1c680 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1c690 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c6a0 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1c6b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c6c0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1c6d0 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1c6e0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1c6f0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1c700 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c710 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1c720 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1c730 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1c740 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1c750 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1c760 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1c770 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1c780 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1c790 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1c7a0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1c7b0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1c7c0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1c7d0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1c7e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c7f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1c800 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1c810 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1c820 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1c830 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1c840 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1c850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1c860 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1c870 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1c880 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1c890 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f  double rhs = (do
1c8a0 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a  uble)pRhs->u.i;.
1c8b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c8c0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1c8d0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1c8e0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1c8f0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
1c900 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  .r<rhs ){.      
1c910 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1c920 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1c930 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20  em1.u.r>rhs ){. 
1c940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1c950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c970 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1c980 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1c990 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1c9a0 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1c9b0 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1c9c0 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1c9d0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1c9e0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1c9f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ca00 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1ca10 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1ca20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ca40 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1ca50 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1ca60 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1ca70 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1ca80 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1ca90 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1caa0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1cab0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
1cac0 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f  erial types 12 o
1cad0 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74  r greater are st
1cae0 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20  rings and blobs 
1caf0 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20  (greater than.  
1cb00 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73        ** numbers
1cb10 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20  ). Types 10 and 
1cb20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  11 are currently
1cb30 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66   "reserved for f
1cb40 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  uture .        *
1cb50 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f  * use", so it do
1cb60 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74  esn't really mat
1cb70 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73  ter what the res
1cb80 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e  ults of comparin
1cb90 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
1cba0 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61  m to numberic va
1cbb0 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20  lues are.  */.  
1cbc0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1cbd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1cbe0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1cbf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1cc00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cc10 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1cc20 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20  s = pRhs->u.r;. 
1cc30 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68         double lh
1cc40 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
1cc50 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1cc60 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1cc70 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1cc80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
1cc90 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1cca0 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d           lhs = m
1ccb0 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20  em1.u.r;.       
1ccc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ccd0 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29    lhs = (double)
1cce0 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20  mem1.u.i;.      
1ccf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1cd00 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1cd10 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1cd20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cd30 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1cd40 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1cd50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cd60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1cd70 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1cd80 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1cd90 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1cda0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1cdb0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1cdc0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1cdd0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1cde0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1cdf0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1ce00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1ce10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ce20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1ce30 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1ce40 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1ce50 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1ce60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ce70 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1ce80 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1ce90 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1cea0 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1ceb0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1cec0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1ced0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1cee0 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1cef0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1cf00 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1cf10 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1cf20 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1cf30 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1cf40 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1cf50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1cf60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1cf90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1cfa0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
1cfb0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
1cfc0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
1cfd0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1cfe0 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
1cff0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1d000 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
1d010 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
1d020 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
1d030 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
1d040 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
1d050 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
1d060 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
1d070 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
1d080 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
1d090 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
1d0a0 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
1d0b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
1d0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d0d0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
1d0e0 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
1d0f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d100 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1d110 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1d120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d130 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
1d140 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
1d150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d160 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d170 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
1d180 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1d190 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1d1a0 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67  _Blob ){.      g
1d1b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d1c0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1d1d0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1d1e0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1d1f0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1d200 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1d210 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  12 || (serial_ty
1d220 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1d230 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1d240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d250 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28      int nStr = (
1d260 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1d270 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1d280 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1d290 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  r)==(unsigned)nK
1d2a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1d2b0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1d2c0 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  r+1)==(unsigned)
1d2d0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1d2e0 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e   if( (d1+nStr) >
1d2f0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1d300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1d310 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1d320 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1d330 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1d340 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d360 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1d370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d380 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1d390 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1d3a0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1d3b0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1d3c0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1d3d0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1d3e0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1d3f0 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1d400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d410 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d420 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1d430 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1d440 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1d450 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1d460 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1d470 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1d480 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1d490 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1d4a0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1d4b0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1d4c0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1d4d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
1d4e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1d4f0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1d500 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
1d510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d520 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1d530 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1d540 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1d550 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d560 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
1d570 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
1d580 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1d590 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1d5a0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
1d5b0 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
1d5c0 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
1d5d0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
1d5e0 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
1d5f0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1d600 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c  2->nField && d1<
1d610 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1d620 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1d630 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1d640 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1d650 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1d660 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1d670 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1d680 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1d690 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1d6a0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1d6b0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1d6c0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1d6d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1d6e0 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
1d6f0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1d700 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1d710 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1d720 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1d730 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
1d740 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1d750 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1d760 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1d770 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1d780 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1d790 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1d7a0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1d7b0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1d7c0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
1d7d0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d7e0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d7f0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
1d800 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
1d810 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
1d820 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1d830 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1d840 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1d850 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
1d860 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d870 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
1d880 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1d890 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1d8a0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1d8b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1d8c0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
1d8d0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1d8e0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d8f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d900 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1d910 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
1d920 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
1d930 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1d940 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1d950 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1d960 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1d970 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1d980 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1d990 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
1d9a0 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
1d9b0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
1d9c0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
1d9d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1d9e0 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1d9f0 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
1da00 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
1da10 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
1da20 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
1da30 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
1da40 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
1da50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
1da60 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
1da70 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
1da80 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
1da90 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
1daa0 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
1dab0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1dac0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1dad0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1dae0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1daf0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1db00 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1db10 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1db20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1db30 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1db40 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
1db50 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
1db60 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
1db70 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
1db80 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
1db90 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
1dba0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
1dbb0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
1dbc0 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e  i64 v = pPKey2->
1dbd0 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69  aMem[0].u.i;.  i
1dbe0 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
1dbf0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1dc00 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
1dc10 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1dc20 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
1dc30 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
1dc40 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
1dc50 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
1dc60 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1dc70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
1dc80 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
1dc90 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1dca0 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
1dcb0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1dcc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1dcd0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1dce0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1dcf0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1dd00 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1dd10 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1dd20 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1dd30 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1dd40 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1dd50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dd60 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1dd70 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1dd80 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1dd90 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
1dda0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1ddb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1ddc0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1ddd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1dde0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1ddf0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1de00 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
1de10 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1de20 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
1de30 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1de40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1de50 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1de60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1de70 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1de80 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1de90 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1dea0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1deb0 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1dec0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1ded0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1dee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1def0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1df00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1df10 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1df20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1df30 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1df40 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1df50 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1df60 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1df70 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1df80 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1df90 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
1dfa0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1dfb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dfc0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
1dfd0 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
1dfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1dff0 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1e000 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1e010 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
1e020 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
1e030 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
1e040 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
1e050 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
1e060 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
1e070 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
1e080 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
1e090 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
1e0a0 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
1e0b0 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
1e0c0 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
1e0d0 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
1e0e0 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
1e0f0 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
1e100 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
1e110 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
1e120 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
1e130 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
1e140 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
1e150 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
1e160 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
1e170 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
1e180 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
1e190 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
1e1a0 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
1e1b0 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
1e1c0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e1d0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e1e0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1e1f0 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
1e200 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1e210 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1e220 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e230 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e240 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Key2);.  }..  if
1e250 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
1e260 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1e270 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
1e280 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1e290 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
1e2a0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
1e2b0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
1e2c0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1e2d0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1e2e0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
1e2f0 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
1e300 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
1e310 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
1e320 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1e330 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e340 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1e350 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
1e360 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e370 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1e380 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1e390 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
1e3a0 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
1e3b0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
1e3c0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
1e3d0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
1e3e0 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
1e3f0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1e400 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20  fault_rc;.  }.. 
1e410 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1e420 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1e430 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e440 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
1e450 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1e460 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e470 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1e480 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1e490 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e4a0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1e4b0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1e4c0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1e4d0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1e4e0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
1e4f0 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
1e500 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1e510 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
1e520 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
1e530 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1e540 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
1e550 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1e560 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1e570 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
1e580 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1e590 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1e5a0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1e5b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1e5c0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1e5d0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1e5e0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1e5f0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1e600 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1e610 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1e620 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
1e630 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
1e640 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65  int res;..  vdbe
1e650 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1e660 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1e670 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1e680 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1e690 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1e6a0 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
1e6b0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
1e6c0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1e6d0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e6e0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
1e6f0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
1e700 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
1e710 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
1e720 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1e730 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
1e740 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
1e750 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
1e760 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
1e770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1e780 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
1e790 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
1e7a0 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
1e7b0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
1e7c0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
1e7d0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
1e7e0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
1e7f0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
1e800 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e810 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e820 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1e830 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
1e840 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e850 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
1e860 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1e870 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
1e880 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
1e890 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
1e8a0 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
1e8b0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
1e8c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
1e8d0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
1e8e0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
1e8f0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1e900 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
1e910 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1e920 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
1e930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e940 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1e950 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1e960 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
1e970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e980 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1e990 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1e9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e9b0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1e9c0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1e9d0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1e9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e9f0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1ea00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ea10 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1ea20 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1ea30 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
1ea40 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
1ea50 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1ea60 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1ea70 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1ea80 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1ea90 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1eaa0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
1eab0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1eac0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
1ead0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1eae0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1eaf0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1eb00 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1eb10 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1eb20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1eb30 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
1eb40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
1eb50 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
1eb60 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
1eb70 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
1eb80 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
1eb90 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
1eba0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
1ebb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
1ebc0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
1ebd0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
1ebe0 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
1ebf0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1ec00 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
1ec10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1ec20 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
1ec30 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
1ec40 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1ec50 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
1ec60 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
1ec70 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
1ec80 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
1ec90 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
1eca0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
1ecb0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1ecc0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
1ecd0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
1ece0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
1ecf0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
1ed00 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
1ed10 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
1ed20 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
1ed30 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
1ed40 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
1ed50 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
1ed60 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
1ed70 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
1ed80 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
1ed90 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
1eda0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
1edb0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
1edc0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1edd0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
1ede0 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
1edf0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
1ee00 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
1ee10 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
1ee20 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
1ee30 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1ee40 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
1ee50 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
1ee60 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
1ee70 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
1ee80 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
1ee90 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
1eea0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
1eeb0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
1eec0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1eed0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
1eee0 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
1eef0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
1ef00 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
1ef10 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
1ef20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
1ef30 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
1ef40 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1ef50 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
1ef60 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
1ef70 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
1ef80 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
1ef90 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
1efa0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
1efb0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1efc0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1efd0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
1efe0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
1eff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f000 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
1f010 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1f020 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1f030 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
1f040 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1f050 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
1f060 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1f070 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1f080 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f090 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1f0a0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
1f0b0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
1f0c0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
1f0d0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
1f0e0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
1f0f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1f100 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
1f110 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1f120 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1f130 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
1f140 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1f150 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f160 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
1f170 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
1f180 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
1f190 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1f1a0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1f1b0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
1f1c0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
1f1d0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
1f1e0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
1f1f0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
1f200 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
1f210 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1f220 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
1f230 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1f240 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
1f250 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
1f260 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
1f270 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
1f280 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
1f290 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
1f2a0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
1f2b0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
1f2c0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
1f2d0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
1f2e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1f2f0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
1f300 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
1f310 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
1f320 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
1f330 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1f340 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
1f350 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f360 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
1f370 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
1f380 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1f390 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1f3a0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
1f3b0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
1f3c0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1f3d0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
1f3e0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1f3f0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1f400 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1f410 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1f420 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1f430 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1f440 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1f450 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1f460 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1f470 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1f480 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1f490 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1f4a0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1f4b0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1f4c0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1f4d0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1f4e0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1f4f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1f500 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1f510 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1f520 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1f530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f540 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1f550 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1f560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f570 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1f580 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1f590 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1f5a0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1f5b0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1f5c0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1f5d0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1f5e0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1f5f0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1f600 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1f610 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
1f620 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
1f630 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
1f640 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1f650 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1f660 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1f670 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1f680 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1f690 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1f6a0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1f6b0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1f6c0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1f6d0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1f6e0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1f6f0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1f700 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1f710 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1f720 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1f730 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1f740 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1f750 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1f760 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1f770 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1f780 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1f790 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1f7a0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1f7b0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1f7c0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1f7d0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1f7e0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1f7f0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1f800 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1f810 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1f820 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1f830 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1f840 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f850 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1f860 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f870 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1f880 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f890 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1f8a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1f8b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f8c0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1f8d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f8e0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1f8f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f900 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1f910 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1f920 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1f930 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1f940 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1f950 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1f960 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1f970 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
1f980 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
1f990 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1f9a0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
1f9b0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
1f9c0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1f9d0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
1f9e0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
1f9f0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1fa00 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1fa10 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
1fa20 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
1fa30 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1fa40 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
1fa50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1fa60 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
1fa70 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
1fa80 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
1fa90 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
1faa0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1fab0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1fac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1fad0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1fae0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1faf0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1fb00 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
1fb10 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
1fb20 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
1fb30 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1fb40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
1fb50 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
1fb60 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
1fb70 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
1fb80 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1fb90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1fba0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1fbb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fbc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1fbd0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
1fbe0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
1fbf0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
1fc00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
1fc10 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
1fc20 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
1fc30 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
1fc40 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
1fc50 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
1fc60 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1fc70 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
1fc80 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1fc90 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
1fca0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
1fcb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1fcc0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
1fcd0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
1fce0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
1fcf0 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
1fd00 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
1fd10 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
1fd20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
1fd30 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
1fd40 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1fd50 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
1fd60 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
1fd70 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
1fd80 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
1fd90 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
1fda0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
1fdb0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
1fdc0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
1fdd0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
1fde0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
1fdf0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
1fe00 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
1fe10 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe30 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1fe40 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
1fe50 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
1fe60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fe70 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
1fe80 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
1fe90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1fea0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
1feb0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
1fec0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
1fed0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1ff00 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
1ff10 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
1ff20 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1ff30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
1ff40 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
1ff50 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
1ff60 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
1ff70 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ff80 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
1ff90 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
1ffa0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
1ffb0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
1ffc0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
1ffd0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1ffe0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
1fff0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
20000 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
20010 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
20020 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
20030 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
20040 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
20050 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
20060 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
20070 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
20080 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
20090 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
200a0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
200b0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
200c0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
200d0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
200e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
200f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20100 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
20110 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
20120 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
20130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
20140 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
20150 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e  ursor, 0, (u32)n
20160 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
20170 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
20180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20190 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
201a0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
201b0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
201c0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
201d0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
201e0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
201f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20200 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
20210 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
20220 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
20230 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
20240 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
20250 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
20260 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
20270 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
20280 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
20290 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
202a0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
202b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
202c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
202d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
202e0 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
202f0 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
20300 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
20310 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
20320 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
20330 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
20340 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
20350 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
20360 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
20370 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20380 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
20390 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
203a0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
203b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
203c0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
203d0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
203e0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
203f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
20400 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
20410 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
20420 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
20430 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
20440 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
20450 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
20460 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
20470 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
20480 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
20490 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
204a0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
204b0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
204c0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
204d0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
204e0 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
204f0 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
20500 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
20510 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
20520 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
20530 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
20540 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
20550 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
20560 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
20570 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
20580 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
20590 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
205a0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
205b0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
205c0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
205d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
205e0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
205f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20600 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
20610 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
20620 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
20630 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
20640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
20650 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
20660 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
20670 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
20680 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
20690 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
206a0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
206b0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
206c0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
206d0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
206e0 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
206f0 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
20700 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
20710 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
20720 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
20730 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
20740 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
20750 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
20760 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
20770 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
20780 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
20790 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
207a0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
207b0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
207c0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
207d0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
207e0 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
207f0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
20800 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
20810 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
20820 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
20830 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
20840 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
20850 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20860 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
20870 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
20880 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
20890 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
208a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
208b0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
208c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
208d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
208e0 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
208f0 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
20900 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
20910 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
20920 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20930 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
20940 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
20950 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
20960 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
20970 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
20980 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
20990 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
209a0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
209b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
209c0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
209d0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
209e0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
209f0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
20a00 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
20a10 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
20a20 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
20a30 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
20a40 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
20a50 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
20a60 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
20a70 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
20a80 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
20a90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20aa0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
20ab0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
20ac0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
20ad0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
20ae0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
20af0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
20b00 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
20b10 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
20b20 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
20b30 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
20b40 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
20b50 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
20b60 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
20b70 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
20b80 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
20b90 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
20ba0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
20bb0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
20bc0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
20bd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20be0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
20bf0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
20c00 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20c10 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
20c20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
20c30 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
20c40 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
20c50 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
20c60 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20c70 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.