/ Hex Artifact Content
Login

Artifact 9c59b0604489ebe62869a59f3b627c822d32b278:


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 37 20 29  f( i+n>nTemp-7 )
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 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
7d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
7d90: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
7da0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
7db0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
7dc0: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
7dd0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
7de0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7df0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
7e00: 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31  p[i], zColl, n+1
7e10: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
7e20: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
7e30: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29   zTemp[i++] = ')
7e40: 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  ';.      zTemp[i
7e50: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  ] = 0;.      ass
7e60: 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a  ert( i<nTemp );.
7e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7e80: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43   }.    case P4_C
7e90: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
7ea0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7eb0: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
7ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7ed0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7ee0: 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  emp, "(%.20s)", 
7ef0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
7f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f10: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
7f20: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
7f30: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
7f40: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
7f50: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7f60: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7f70: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
7f80: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
7f90: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
7fa0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
7fb0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7fc0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
7fd0: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
7fe0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
7ff0: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
8000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8010: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8020: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
8030: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
8040: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
8050: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8060: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
8070: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
8080: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8090: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
80a0: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
80b0: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
80c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
80d0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
80e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
80f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8100: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
8110: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
8120: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8130: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
8140: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8150: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8160: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
8170: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
8180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8190: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
81a0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
81b0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
81c0: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
81d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
81e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
81f0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
8200: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
8210: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
8220: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8230: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8240: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
8250: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
8260: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
8270: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
8280: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
8290: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
82a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
82b0: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
82c0: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
82d0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
82e0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
82f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8300: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8310: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
8320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8330: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8340: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
8350: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
8360: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
8370: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8380: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
83a0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
83b0: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
83c0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
83d0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
83e0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8400: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8410: 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  mp, "vtab:%p", p
8420: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
8430: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8440: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
8450: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
8460: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8470: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
8480: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
8490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
84a0: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
84b0: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
84c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
84d0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
84e0: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
84f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8500: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
8510: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
8520: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
8530: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
8540: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
8550: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
8560: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
8570: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
8580: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
8590: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
85a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
85b0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
85c0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
85d0: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
85e0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
85f0: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
8600: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
8610: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
8620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
8630: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8640: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
8650: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
8660: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
8670: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
8680: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
8690: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
86a0: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
86b0: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
86c0: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
86d0: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
86e0: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
86f0: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
8700: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
8710: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
8720: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
8730: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8740: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
8750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
8760: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
8770: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
8780: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
8790: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
87a0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
87b0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
87c0: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
87d0: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
87e0: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
87f0: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
8800: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
8810: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
8820: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
8830: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
8840: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
8850: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8860: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8870: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8880: 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  E>0./*.** If SQL
8890: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
88a0: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
88b0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
88c0: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
88d0: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
88e0: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
88f0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
8900: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
8910: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
8920: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
8930: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
8940: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
8950: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
8960: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
8970: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
8980: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
8990: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
89a0: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
89b0: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
89c0: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
89d0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
89e0: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
89f0: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
8a00: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
8a10: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
8a20: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
8a30: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
8a40: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
8a50: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
8a60: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
8a70: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
8a80: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
8a90: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
8aa0: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
8ab0: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
8ac0: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
8ad0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
8ae0: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
8af0: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
8b00: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
8b10: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
8b20: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
8b30: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
8b40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
8b50: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
8b60: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
8b70: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
8b80: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
8b90: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
8ba0: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
8bb0: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
8bc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
8bd0: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
8be0: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
8bf0: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
8c00: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
8c10: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
8c20: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
8c30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
8c40: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
8c50: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
8c60: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
8c70: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
8c80: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
8c90: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
8ca0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
8cb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8cc0: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
8cd0: 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73  nDb;.  if( DbMas
8ce0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
8cf0: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
8d00: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
8d10: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
8d20: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
8d30: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
8d40: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
8d50: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
8d60: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
8d70: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
8d80: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
8d90: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
8da0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8db0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
8dc0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
8dd0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
8de0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8df0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
8e00: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
8e10: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
8e20: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
8e30: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
8e40: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
8e50: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8e60: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
8e70: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8e80: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62  OINLINE void vdb
8e90: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
8ea0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
8eb0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
8ec0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
8ed0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
8ee0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
8ef0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
8f00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
8f10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
8f20: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
8f30: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
8f40: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
8f50: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
8f60: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
8f70: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
8f80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
8f90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65  id sqlite3VdbeLe
8fa0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
8fb0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8fc0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
8fd0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
8fe0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
8ff0: 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a    vdbeLeave(p);.
9000: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
9010: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
9020: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
9030: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
9040: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
9050: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
9060: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
9070: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
9080: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
9090: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
90a0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
90b0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
90c0: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
90d0: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61   zPtr[50];.  cha
90e0: 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73  r zCom[100];.  s
90f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9100: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
9110: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
9120: 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25  %4d %-13s %.2X %
9130: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
9140: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
9150: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
9160: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
9170: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
9180: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9190: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
91a0: 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79  MMENTS.  display
91b0: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
91c0: 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zCom, sizeof(z
91d0: 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a  Com));.#else.  z
91e0: 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64  Com[0] = 0;.#end
91f0: 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65  if.  /* NB:  The
9200: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
9210: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  me() function is
9220: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
9230: 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a  code created.  *
9240: 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64  * by the mkopcod
9250: 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63  eh.awk and mkopc
9260: 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73  odec.awk scripts
9270: 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74   which extract t
9280: 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  he.  ** informat
9290: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62  ion from the vdb
92a0: 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20  e.c source text 
92b0: 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  */.  fprintf(pOu
92c0: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
92d0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
92e0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
92f0: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
9300: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
9310: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
9320: 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b  .      zCom.  );
9330: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
9340: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
9350: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
9360: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
9370: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
9380: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
9390: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
93a0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
93b0: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
93c0: 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71   = &p[N];.    sq
93d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
93e0: 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  b;.    u8 malloc
93f0: 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  _failed = db->ma
9400: 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
9410: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
9420: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
9430: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
9440: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
9450: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
9460: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
9470: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
9480: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
9490: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
94a0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
94b0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
94c0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
94d0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
94e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
94f0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
9500: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
9510: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
9520: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
9530: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
9540: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
9550: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
9560: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
9570: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
9580: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
9590: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
95a0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
95b0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
95c0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
95d0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
95e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
95f0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
9600: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
9610: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
9620: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
9630: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
9640: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
9650: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
9660: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
9670: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
9680: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
9690: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
96a0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
96b0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
96c0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
96d0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
96e0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
96f0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
9700: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
9710: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
9720: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
9730: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
9740: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
9750: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
9760: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
9770: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
9780: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
9790: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
97a0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
97b0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
97c0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
97d0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
97e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
97f0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
9800: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
9810: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
9820: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
9830: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
9840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
9850: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
9860: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
9870: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
9880: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
9890: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
98a0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
98b0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
98c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
98d0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
98e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
98f0: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
9900: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9910: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
9920: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  );.        p->sz
9930: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
9940: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
9950: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
9960: 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ned;.    }while(
9970: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
9980: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
9990: 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69  led = malloc_fai
99a0: 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  led;.  }.}../*.*
99b0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
99c0: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
99d0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
99e0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
99f0: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
9a00: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
9a10: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
9a20: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
9a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9a40: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
9a50: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
9a60: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
9a70: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
9a80: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
9a90: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
9aa0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
9ab0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
9ac0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9ad0: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
9ae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9af0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
9b00: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
9b10: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
9b20: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
9b30: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
9b40: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
9b50: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
9b60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9b70: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
9b80: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
9b90: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
9ba0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
9bb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
9bc0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
9bd0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
9be0: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
9bf0: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
9c00: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
9c10: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
9c20: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
9c30: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
9c40: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
9c50: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
9c60: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
9c70: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
9c80: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
9c90: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
9ca0: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
9cb0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
9cc0: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
9cd0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
9ce0: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
9cf0: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
9d00: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
9d10: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
9d20: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
9d30: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
9d40: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
9d50: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
9d60: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
9d70: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
9d80: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
9d90: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
9da0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
9db0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
9dc0: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
9dd0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
9de0: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e00: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
9e10: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
9e40: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
9e50: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
9e60: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9e90: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
9ea0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
9eb0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
9ec0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9ed0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
9ee0: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
9ef0: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
9f20: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
9f30: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
9f40: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
9f70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
9f80: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9fb0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
9fc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9ff0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
a000: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
a010: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
a020: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
a030: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
a040: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
a050: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
a060: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
a070: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
a080: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a090: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
a0a0: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
a0b0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
a0c0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
a0d0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
a0e0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
a0f0: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
a100: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
a110: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
a120: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
a130: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
a140: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
a150: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
a160: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
a170: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
a180: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
a190: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
a1a0: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
a1b0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
a1c0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
a1d0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
a1e0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
a1f0: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
a200: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
a210: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
a220: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
a230: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
a240: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
a250: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
a260: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
a270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
a280: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
a290: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
a2a0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
a2b0: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
a2c0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
a2d0: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
a2e0: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
a2f0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
a300: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
a310: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
a320: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
a330: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a340: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
a350: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
a360: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
a370: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
a380: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
a390: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
a3a0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
a3b0: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
a3c0: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
a3d0: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
a3e0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
a3f0: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
a400: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
a410: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
a420: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
a430: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
a440: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65  >nOp;.  if( p->e
a450: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
a460: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
a470: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
a480: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
a490: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
a4a0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
a4b0: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
a4c0: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
a4d0: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
a4e0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
a4f0: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
a500: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
a510: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
a520: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
a530: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
a540: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
a550: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
a560: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
a570: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
a580: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
a590: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
a5a0: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
a5b0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
a5c0: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
a5d0: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
a5e0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
a5f0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
a600: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
a610: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
a620: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
a630: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
a640: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
a650: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
a660: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
a670: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
a680: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
a690: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
a6a0: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
a6b0: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
a6c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
a6d0: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
a6e0: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f  .  }while( i<nRo
a6f0: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  w && p->explain=
a700: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
a710: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
a720: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e  in );.  if( i>=n
a730: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  Row ){.    p->rc
a740: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a750: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
a760: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
a770: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
a780: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
a790: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
a7a0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
a7b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
a7d0: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  r(p, sqlite3ErrS
a7e0: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
a7f0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
a800: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
a810: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
a820: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
a830: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
a840: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
a850: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
a860: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
a870: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
a880: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
a890: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
a8a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a8b0: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
a8c0: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
a8d0: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
a8e0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
a8f0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
a900: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
a910: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
a920: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a930: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
a940: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
a950: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
a960: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
a970: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
a980: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
a990: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
a9a0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
a9b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
a9c0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
a9d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a9e0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
a9f0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
aa20: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
aa30: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
aa40: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
aa50: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
aa60: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
aa70: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
aa80: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
aa90: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
aaa0: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
aab0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
aac0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
aad0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
aae0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
aaf0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
ab00: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
ab10: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
ab20: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
ab30: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
ab40: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
ab50: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
ab60: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
ab70: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
ab80: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
ab90: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
aba0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
abb0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
abc0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
abd0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
abe0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
abf0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
ac00: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
ac10: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
ac20: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
ac30: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
ac40: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
ac50: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
ac60: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
ac70: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
ac80: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
ac90: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
aca0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
acb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
acc0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
acd0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
ace0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
acf0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
ad00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
ad10: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
ad20: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
ad30: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
ad40: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
ad50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
ad60: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
ad70: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
ad80: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
ad90: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
ada0: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
adb0: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
adc0: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
add0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
ade0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
adf0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae10: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
ae20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ae30: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
ae40: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
ae70: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
ae80: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ae90: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
aea0: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
aed0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
aee0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
aef0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
af00: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
af30: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
af40: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
af50: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
af60: 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f  e(pMem, 32) ){ /
af70: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
af80: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
af90: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
afa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
afb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
afc0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
afd0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
afe0: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
aff0: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
b000: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
b010: 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b   zP4!=pMem->z ){
b020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b030: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
b040: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
b050: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
b060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
b070: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
b080: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
b090: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
b0a0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
b0b0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
b0c0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
b0d0: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
b0e0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
b0f0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
b100: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b110: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
b120: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
b130: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
b140: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
b160: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
b180: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
b190: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
b1a0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
b1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
b1c0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
b1d0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
b1e0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
b1f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
b200: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
b210: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
b220: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b230: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
b240: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
b250: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
b260: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
b270: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
b280: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
b290: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b2a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
b2b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
b2d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
b2e0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
b2f0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
b300: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
b310: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
b320: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
b330: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
b340: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
b350: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b360: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b380: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
b390: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
b3a0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
b3b0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
b3c0: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
b3d0: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
b3e0: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
b3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b400: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
b410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b420: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b430: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b440: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
b450: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
b460: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
b470: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
b480: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
b490: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
b4a0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
b4b0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
b4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
b4d0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
b4e0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
b4f0: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
b500: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
b510: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
b520: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
b530: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
b540: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
b550: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
b560: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
b570: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
b580: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
b590: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
b5a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
b5b0: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
b5c0: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
b5d0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
b5e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b5f0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
b600: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
b610: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
b620: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
b630: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
b640: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
b650: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
b660: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
b670: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
b680: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
b690: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
b6a0: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
b6b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
b6c0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
b6d0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
b6e0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
b6f0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
b700: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
b710: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
b720: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
b730: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
b740: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
b750: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
b760: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
b770: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
b780: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
b790: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
b7a0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
b7b0: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
b7c0: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
b7d0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
b7e0: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
b7f0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
b800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
b810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
b820: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
b830: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
b840: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
b850: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
b860: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
b870: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
b880: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
b890: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
b8a0: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
b8b0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
b8c0: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
b8d0: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
b8e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b8f0: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
b900: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
b910: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
b920: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
b930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
b940: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
b950: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
b960: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
b970: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
b980: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
b990: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
b9a0: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
b9b0: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
b9c0: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b9d0: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
b9e0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b9f0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
ba00: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
ba10: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
ba20: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
ba30: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
ba40: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
ba50: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
ba60: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
ba70: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
ba80: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
ba90: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
baa0: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
bab0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
bac0: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
bad0: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
bae0: 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  nts to available
baf0: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
bb00: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
bb10: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
bb20: 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68  lable space.  Wh
bb30: 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  en space is allo
bb40: 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69  cated, *ppFrom i
bb50: 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a  s advanced past.
bb60: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
bb70: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
bb80: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
bb90: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
bba0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
bbb0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
bbc0: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
bbd0: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
bbe0: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
bbf0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
bc00: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
bc10: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
bc20: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
bc30: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
bc40: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
bc50: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
bc60: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
bc70: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
bc80: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
bc90: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
bca0: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
bcb0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
bcc0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
bcd0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
bce0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
bcf0: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
bd00: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
bd10: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
bd20: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
bd30: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
bd40: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
bd50: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
bd60: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
bd70: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
bd80: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
bd90: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
bda0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
bdb0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
bdc0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
bdd0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
bde0: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
bdf0: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29   );.  if( pBuf )
be00: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20   return pBuf;.  
be10: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
be20: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a  Byte);.  if( &(*
be30: 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c  ppFrom)[nByte] <
be40: 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42  = pEnd ){.    pB
be50: 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46  uf = (void*)*ppF
be60: 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d  rom;.    *ppFrom
be70: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c   += nByte;.  }el
be80: 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20  se{.    *pnByte 
be90: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20  += nByte;.  }.  
bea0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
beb0: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
bec0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
bed0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
bee0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
bef0: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
bf00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bf10: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
bf20: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
bf30: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
bf40: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
bf50: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
bf60: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
bf70: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bf80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
bf90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
bfa0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
bfb0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
bfc0: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
bfd0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
bfe0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
bff0: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
c000: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
c010: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
c020: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
c030: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
c040: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
c050: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
c060: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
c070: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
c080: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
c090: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
c0a0: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
c0b0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
c0c0: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
c0d0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
c0e0: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
c0f0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
c100: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
c110: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
c120: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
c130: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
c140: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
c150: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
c160: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
c170: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
c180: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
c190: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
c1a0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
c1b0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
c1c0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
c1d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
c1e0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
c1f0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
c200: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
c210: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
c220: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
c230: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
c240: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
c250: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
c260: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
c270: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
c280: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
c290: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
c2a0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
c2b0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
c2c0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
c2d0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
c2e0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
c2f0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
c300: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
c310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
c320: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
c330: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
c340: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
c350: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
c360: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c370: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
c380: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
c390: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
c3a0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
c3b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c3c0: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
c3d0: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
c3e0: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
c3f0: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
c400: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
c410: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
c420: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
c430: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
c440: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
c450: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
c460: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
c470: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
c480: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
c490: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
c4a0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
c4b0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
c4c0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
c4d0: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
c4e0: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
c4f0: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
c500: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
c510: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
c520: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
c530: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
c540: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
c550: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
c580: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
c590: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
c5a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c5b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
c5c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5e0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
c5f0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
c600: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c620: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
c630: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
c640: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
c650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c660: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
c670: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
c680: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c6a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
c6b0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
c6c0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
c6f0: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
c700: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
c710: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
c720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c730: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
c740: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
c750: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c780: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
c7b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
c7c0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
c7d0: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c7f0: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
c800: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
c810: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
c840: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
c850: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
c860: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
c870: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
c880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c890: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
c8a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
c8b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
c8c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
c8d0: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
c8e0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
c8f0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
c900: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
c910: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
c920: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
c930: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
c940: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
c950: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
c960: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
c970: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
c980: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
c990: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
c9a0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
c9b0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
c9c0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
c9d0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
c9e0: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
c9f0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
ca00: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
ca10: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
ca20: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
ca30: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
ca40: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
ca50: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
ca60: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
ca70: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
ca80: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
ca90: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
caa0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
cab0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
cac0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
cad0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
cae0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
caf0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
cb00: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
cb10: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
cb20: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
cb30: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
cb40: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
cb50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
cb60: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
cb70: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
cb80: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
cb90: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
cba0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
cbb0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
cbc0: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
cbd0: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
cbe0: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
cbf0: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
cc00: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
cc10: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
cc20: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
cc30: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
cc40: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
cc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
cc60: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
cc70: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
cc80: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
cc90: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
cca0: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
ccb0: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
ccc0: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
ccd0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
cce0: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
ccf0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
cd00: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
cd10: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
cd20: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
cd30: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
cd40: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
cd50: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
cd60: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
cd70: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
cd80: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
cd90: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
cda0: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
cdb0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
cdc0: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
cdd0: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
cde0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
cdf0: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
ce00: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
ce10: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
ce20: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
ce30: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
ce40: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
ce50: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
ce60: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
ce70: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
ce80: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
ce90: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
cea0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
ceb0: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
cec0: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
ced0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
cee0: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
cef0: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
cf00: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
cf10: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
cf20: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
cf30: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
cf40: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
cf50: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
cf60: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
cf70: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
cf80: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
cf90: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
cfa0: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
cfb0: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
cfc0: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
cfd0: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
cfe0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
cff0: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
d000: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
d010: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
d020: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
d030: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
d040: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
d050: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
d060: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
d070: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
d080: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
d090: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
d0a0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
d0b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
d0c0: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
d0d0: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
d0e0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
d0f0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
d100: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
d110: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
d120: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
d130: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
d140: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
d150: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
d160: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
d170: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
d180: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
d190: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d1b0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
d1c0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
d1d0: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
d1e0: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
d1f0: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
d200: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66  nd, &nByte);.#if
d210: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d220: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
d230: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
d240: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
d250: 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73  anExec, p->nOp*s
d260: 69 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73  izeof(i64), &zCs
d270: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
d280: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d290: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
d2a0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
d2b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d2c0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
d2d0: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
d2e0: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
d2f0: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
d300: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
d310: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
d320: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
d330: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
d340: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
d350: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
d360: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
d370: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
d380: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
d390: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
d3a0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
d3b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
d3c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
d3d0: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
d3e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
d3f0: 7a 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e  zVar && pParse->
d400: 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70  nzVar>0 ){.    p
d410: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->nzVar = pParse
d420: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d  ->nzVar;.    mem
d430: 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50  cpy(p->azVar, pP
d440: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e  arse->azVar, p->
d450: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nzVar*sizeof(p->
d460: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20  azVar[0]));.    
d470: 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61  memset(pParse->a
d480: 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d  zVar, 0, pParse-
d490: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50  >nzVar*sizeof(pP
d4a0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  arse->azVar[0]))
d4b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
d4c0: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d  Mem ){.    p->aM
d4d0: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
d4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
d4f0: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
d500: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d  ..nMem */.    p-
d510: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d530: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
d540: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
d550: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
d560: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  m; n++){.      p
d570: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
d580: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
d590: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
d5a0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
d5b0: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
d5c0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
d5d0: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
d5e0: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
d5f0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
d600: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
d610: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
d620: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
d630: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
d640: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
d650: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
d660: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
d670: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
d680: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
d690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d6a0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
d6b0: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
d6c0: 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43  , pCx);.  if( pC
d6d0: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
d6e0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d6f0: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
d700: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
d710: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
d720: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
d730: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
d740: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
d750: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
d760: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
d770: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
d780: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
d790: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
d7a0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
d7b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d7c0: 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66  LTABLE.  else if
d7d0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
d7e0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
d7f0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
d800: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
d810: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
d820: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
d830: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
d840: 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   = pVtabCursor->
d850: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
d860: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 74 61      assert( pVta
d870: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d880: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56  nRef>0 );.    pV
d890: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
d8a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d  ->nRef--;.    pM
d8b0: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
d8c0: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  tabCursor);.  }.
d8d0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d8e0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
d8f0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
d900: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
d910: 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
d920: 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
d930: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
d940: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
d950: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d960: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
d970: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
d980: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
d990: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
d9a0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
d9b0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d9c0: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
d9d0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
d9e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
d9f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
da00: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
da10: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
da20: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
da30: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
da40: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
da50: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
da60: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
da70: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
da80: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
da90: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
daa0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
dab0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
dac0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
dad0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
dae0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
daf0: 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
db00: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
db10: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
db20: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
db30: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
db40: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
db50: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
db60: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
db70: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
db80: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
db90: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
dba0: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
dbb0: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
dbc0: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
dbd0: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
dbe0: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
dbf0: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
dc00: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
dc10: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
dc20: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
dc30: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
dc40: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
dc50: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
dc60: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
dc70: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
dc80: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
dc90: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
dca0: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
dcb0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
dcc0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
dcd0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
dce0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
dcf0: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
dd00: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
dd10: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
dd20: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
dd30: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
dd40: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
dd50: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
dd60: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
dd70: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
dd80: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
dd90: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
dda0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
ddb0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
ddc0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
ddd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
dde0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
ddf0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
de00: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
de10: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
de20: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
de30: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
de40: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
de50: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
de60: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
de70: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
de80: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
de90: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
dea0: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
deb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dec0: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
ded0: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
dee0: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
def0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
df00: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
df10: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
df20: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
df30: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
df40: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
df50: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
df60: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
df70: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
df80: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
df90: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
dfa0: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
dfb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
dfc0: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
dfd0: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
dfe0: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
dff0: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
e000: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
e010: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
e020: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
e030: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
e040: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
e050: 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  VM after a singl
e060: 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e run..*/.static
e070: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
e080: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
e090: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
e0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e0b0: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
e0c0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
e0d0: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
e0e0: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
e0f0: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
e100: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
e110: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
e120: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
e130: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
e140: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
e150: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
e160: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
e170: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
e180: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
e190: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
e1a0: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
e1b0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
e1c0: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
e1d0: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
e1e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
e1f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
e200: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
e210: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
e220: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
e230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e240: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
e250: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
e260: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e270: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
e280: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
e290: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
e2a0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
e2b0: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
e2c0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
e2d0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
e2e0: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
e2f0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
e300: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
e310: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
e320: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
e330: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
e340: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
e350: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
e360: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
e370: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
e380: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
e390: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
e3a0: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
e3b0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
e3c0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
e3d0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
e3e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e3f0: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
e400: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
e410: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
e420: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
e430: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
e440: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
e450: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
e460: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
e470: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e480: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
e490: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
e4a0: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
e4b0: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
e4c0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
e4d0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
e4e0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
e4f0: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
e500: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
e510: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
e520: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
e530: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
e540: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
e550: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
e560: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
e570: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
e580: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
e590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
e5a0: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
e5b0: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
e5c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e5d0: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
e5e0: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
e5f0: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
e600: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
e610: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
e620: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
e630: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
e640: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
e650: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
e660: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
e670: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
e680: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
e690: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
e6a0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
e6b0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
e6c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
e6d0: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
e6e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
e700: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
e710: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
e720: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e740: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
e750: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
e760: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
e790: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
e7a0: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
e7b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7d0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
e7e0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
e7f0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
e800: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
e810: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
e820: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
e830: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
e840: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
e850: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
e860: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
e870: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
e880: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
e890: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
e8a0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
e8b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
e8c0: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
e8d0: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
e8e0: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
e8f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e900: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
e910: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
e920: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
e930: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
e940: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
e950: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e960: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
e970: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
e980: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
e990: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
e9a0: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
e9b0: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
e9c0: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
e9d0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
e9e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
e9f0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
ea00: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
ea10: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
ea20: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
ea30: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
ea40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
ea50: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
ea60: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
ea70: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
ea80: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
ea90: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
eaa0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
eab0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
eac0: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
ead0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
eae0: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
eaf0: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
eb00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
eb10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
eb20: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
eb30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
eb40: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
eb50: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
eb60: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
eb70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eb80: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
eb90: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
eba0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ebb0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
ebc0: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
ebd0: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
ebe0: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
ebf0: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
ec00: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
ec10: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
ec20: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
ec30: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
ec40: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
ec50: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
ec60: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
ec70: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
ec80: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
ec90: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
eca0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
ecb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
ecc0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
ecd0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
ece0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
ecf0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
ed00: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
ed10: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
ed20: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
ed30: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
ed40: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
ed50: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
ed60: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
ed70: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
ed80: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
ed90: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
eda0: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
edb0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
edc0: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
edd0: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
ede0: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
edf0: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
ee00: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
ee10: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
ee20: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
ee30: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
ee40: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
ee50: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
ee60: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
ee70: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
ee80: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
ee90: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
eea0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
eeb0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
eec0: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
eed0: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
eee0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
eef0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ef00: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
ef10: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ef20: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
ef30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
ef40: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
ef50: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
ef60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
ef70: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
ef80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ef90: 74 65 33 42 74 72 65 65 45 78 63 6c 75 73 69 76  te3BtreeExclusiv
efa0: 65 4c 6f 63 6b 28 70 42 74 29 3b 0a 20 20 20 20  eLock(pBt);.    
efb0: 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
efc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4e 43  LITE_ENABLE_CONC
efd0: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 64 62 2d  URRENT.  if( db-
efe0: 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20  >bConcurrent && 
eff0: 28 72 63 20 26 20 30 78 46 46 29 3d 3d 53 51 4c  (rc & 0xFF)==SQL
f000: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
f010: 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f 42 55 53  /* An SQLITE_BUS
f020: 59 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53 59  Y or SQLITE_BUSY
f030: 5f 53 4e 41 50 53 48 4f 54 20 77 61 73 20 65 6e  _SNAPSHOT was en
f040: 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
f050: 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d 70 74 69  .    ** attempti
f060: 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 65 20 57  ng to take the W
f070: 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e 20 61 20  RITER lock on a 
f080: 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c 65 61 73  wal file. Releas
f090: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 52 49  e the.    ** WRI
f0a0: 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c  TER locks on all
f0b0: 20 77 61 6c 20 66 69 6c 65 73 20 61 6e 64 20 72   wal files and r
f0c0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f  eturn early.  */
f0d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f0e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f0f0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f100: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f110: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f120: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
f130: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
f140: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
f150: 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
f160: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 72    sqlite3PagerDr
f170: 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  opExclusiveLock(
f180: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
f190: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20  r(pBt));.       
f1a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f1b0: 76 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  ve(pBt);.      }
f1c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f1d0: 66 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  f..  if( rc!=SQL
f1e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
f1f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
f200: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
f210: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
f220: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
f230: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
f240: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
f250: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
f260: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
f270: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
f280: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
f290: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
f2a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f2b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f2c0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
f2d0: 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
f2e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
f2f0: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
f300: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
f310: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
f320: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
f330: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
f340: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
f350: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
f360: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f370: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
f380: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
f390: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
f3a0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
f3b0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
f3c0: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
f3d0: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
f3e0: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
f3f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
f400: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
f410: 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
f420: 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
f430: 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
f440: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
f450: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
f460: 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
f470: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
f480: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
f490: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
f4a0: 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
f4b0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
f4c0: 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
f4d0: 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
f4e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
f4f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f500: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f510: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f520: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f530: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f550: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f560: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
f570: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f580: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
f590: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
f5a0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
f5b0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
f5c0: 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
f5d0: 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
f5e0: 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
f5f0: 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
f600: 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
f610: 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
f620: 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
f630: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
f640: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
f650: 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
f660: 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
f670: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
f680: 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
f690: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
f6a0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
f6b0: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
f6c0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
f6d0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
f6e0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
f6f0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f700: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f710: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
f720: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f730: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
f740: 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
f750: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f760: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f770: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
f780: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
f790: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
f7a0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
f7b0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
f7c0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
f7d0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
f7e0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
f7f0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
f800: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f810: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
f820: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
f830: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
f840: 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
f850: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f860: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
f870: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
f880: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
f890: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
f8a0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
f8b0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
f8c0: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
f8d0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
f8e0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
f8f0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
f900: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
f910: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
f920: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
f930: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
f940: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
f950: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
f960: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
f970: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
f980: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
f990: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
f9a0: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
f9b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
f9c0: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
f9d0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
f9e0: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
f9f0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
fa00: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
fa10: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
fa20: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
fa30: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
fa40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
fa50: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
fa60: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
fa70: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
fa80: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
fa90: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
faa0: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
fab0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
fac0: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
fad0: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
fae0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
faf0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
fb00: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
fb10: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
fb20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fb30: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
fb40: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
fb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
fb60: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
fb70: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
fb80: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
fb90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
fba0: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
fbb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
fbc0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
fbd0: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
fbe0: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
fbf0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
fc00: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
fc10: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
fc20: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
fc50: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
fc60: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
fc70: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
fc80: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
fc90: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
fca0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
fcb0: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
fcc0: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
fcd0: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
fce0: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
fcf0: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
fd00: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
fd10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
fd20: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
fd30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
fd40: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
fd50: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
fd60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fd70: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
fd80: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
fd90: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
fda0: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
fdb0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
fdc0: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
fdd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fde0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
fdf0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
fe00: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
fe10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
fe20: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
fe30: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
fe40: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
fe50: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
fe60: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
fe70: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
fe80: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
fe90: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
fea0: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
feb0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
fec0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
fed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fee0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fef0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
ff00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff10: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
ff20: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
ff30: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
ff40: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
ff50: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
ff60: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
ff70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
ff80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ff90: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
ffa0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
ffb0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
ffc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ffd0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
ffe0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
fff0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
10000 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
10010 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10020 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
10030 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
10040 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
10050 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
10060 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
10070 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
10080 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
10090 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
100a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
100b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
100c0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
100d0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
100e0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
100f0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
10100 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
10110 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
10120 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
10130 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
10140 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
10150 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
10160 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
10170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10180 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
10190 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
101a0 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
101b0 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
101c0 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
101d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
101e0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
101f0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
10200 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10210 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
10220 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10230 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
10240 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
10250 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
10260 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
10270 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10290 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
102a0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
102b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
102c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
102d0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
102e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
102f0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
10300 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
10310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10330 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
10340 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10350 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10360 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
10370 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
10380 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
10390 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
103a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
103b0 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
103c0 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
103d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
103e0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
103f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
10400 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
10410 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10420 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
10430 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
10440 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
10450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10460 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
10470 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
10480 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10490 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
104a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
104b0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
104c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
104d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
104e0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
104f0 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
10500 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
10510 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
10520 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
10530 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10540 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
10550 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
10560 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
10570 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
10580 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
10590 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
105a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
105b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
105c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
105d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
105e0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
105f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10600 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
10610 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
10620 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
10630 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
10640 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
10650 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
10660 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
10670 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
10680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10690 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
106a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
106b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
106c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
106d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
106e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
106f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10700 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10710 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10720 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10730 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10740 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
10750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10760 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
10770 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
10780 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
10790 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
107a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
107b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
107c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
107d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
107e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
107f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10800 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
10810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10820 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
10830 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10840 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
10850 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
10860 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
10870 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
10880 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
10890 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
108a0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
108b0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
108c0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
108d0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
108e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
108f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
10900 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64  s, zMaster, need
10910 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Sync);.    sqlit
10920 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10930 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
10940 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
10950 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
10960 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10970 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
10980 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
10990 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
109a0 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
109b0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
109c0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
109d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
109e0 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
109f0 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
10a00 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
10a10 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10a20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
10a30 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
10a40 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
10a50 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
10a60 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
10a70 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
10a80 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
10a90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
10aa0 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
10ab0 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
10ac0 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
10ad0 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
10ae0 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
10af0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
10b00 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
10b10 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
10b20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
10b30 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10b40 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
10b50 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
10b60 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
10b70 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
10b80 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
10b90 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10ba0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10bb0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
10bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
10bd0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10be0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
10bf0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
10c00 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
10c10 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
10c20 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10c30 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
10c40 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10c50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
10c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
10c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10c80 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
10c90 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
10ca0 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
10cb0 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
10cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
10cd0 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
10ce0 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
10cf0 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
10d00 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
10d10 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
10d20 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
10d30 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
10d40 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
10d50 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
10d60 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
10d70 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
10d80 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
10d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
10da0 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
10db0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
10dc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
10dd0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
10de0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
10df0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
10e00 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
10e10 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
10e20 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
10e30 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
10e40 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
10e50 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
10e60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
10e70 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
10e80 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
10e90 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
10ea0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
10eb0 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
10ec0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
10ed0 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
10ee0 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
10ef0 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
10f00 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
10f10 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
10f20 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
10f30 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
10f40 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
10f50 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
10f60 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10f70 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
10f80 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
10f90 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
10fa0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
10fb0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
10fc0 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
10fd0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
10fe0 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
10ff0 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
11000 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
11010 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
11020 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
11030 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
11040 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11050 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
11060 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
11070 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
11080 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
11090 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
110a0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
110b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
110c0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
110d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
110e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
110f0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
11100 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
11110 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
11120 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
11130 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
11140 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
11150 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
11160 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
11170 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
11180 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
11190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
111a0 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
111b0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
111c0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
111d0 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
111e0 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
111f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
11200 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
11210 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
11220 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
11230 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
11240 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
11250 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20  curred, causing 
11260 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
11270 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
11280 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
11290 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
112a0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
112b0 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
112c0 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
112d0 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
112e0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
112f0 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
11300 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
11310 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
11320 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
11330 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11340 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
11350 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
11360 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11370 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
11380 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
11390 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
113a0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
113b0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
113c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
113d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
113e0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
113f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
11400 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11410 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11420 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
11430 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
11440 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11460 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
11470 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
11480 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11490 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
114a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
114b0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
114c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
114d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
114e0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
114f0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
11500 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
11510 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11520 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11540 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
11550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11560 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
11570 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
11580 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
11590 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
115a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115b0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
115c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
115d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
115e0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
115f0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
11600 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
11610 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
11620 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
11630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11650 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
11660 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
11670 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
11680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11690 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
116a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
116b0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
116c0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
116d0 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
116e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
116f0 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
11700 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
11710 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
11720 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
11730 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
11740 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11750 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
11760 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
11770 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
11780 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
11790 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
117a0 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20  tDefCons;.      
117b0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
117c0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
117d0 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d  efImmCons;.    }
117e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11800 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11810 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
11820 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
11830 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
11840 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
11850 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
11860 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
11870 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
11880 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
11890 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
118a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
118b0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
118c0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
118d0 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
118e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
118f0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
11900 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
11910 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
11920 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
11930 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
11940 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
11950 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
11960 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
11970 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
11980 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11990 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
119a0 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
119b0 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
119c0 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
119d0 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
119e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
119f0 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
11a00 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
11a10 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
11a20 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
11a30 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11a40 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
11a50 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
11a60 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
11a70 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
11a80 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
11a90 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
11aa0 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
11ab0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11ac0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11ad0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
11ae0 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
11af0 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
11b00 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
11b10 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
11b20 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
11b30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11b40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11b60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11b70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11b80 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
11b90 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
11ba0 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
11bb0 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
11bc0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
11bd0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
11be0 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
11bf0 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
11c00 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
11c10 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
11c20 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
11c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11c40 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
11c50 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
11c60 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
11c70 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
11c80 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
11c90 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
11ca0 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
11cb0 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
11cc0 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
11cd0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
11ce0 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
11cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
11d00 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
11d10 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
11d20 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
11d30 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
11d40 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
11d50 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
11d60 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
11d70 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
11d80 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
11d90 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
11da0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
11db0 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
11dc0 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
11dd0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
11de0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e00 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
11e10 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
11e20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
11e30 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11e40 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
11e50 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
11e60 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
11e70 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
11e80 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
11e90 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
11ea0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
11eb0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
11ec0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
11ed0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11ee0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
11ef0 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
11f00 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
11f10 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
11f20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
11f30 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
11f40 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
11f50 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
11f60 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
11f70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
11f80 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
11f90 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
11fa0 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
11fb0 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
11fc0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11fd0 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11fe0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11ff0 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
12000 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
12010 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
12020 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
12030 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
12040 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
12050 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12060 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
12070 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
12080 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
12090 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
120a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
120b0 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
120c0 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
120d0 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
120e0 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
120f0 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
12100 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
12110 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
12120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12130 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
12140 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
12150 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
12160 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
12170 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
12180 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
12190 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
121a0 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
121b0 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
121c0 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
121d0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
121e0 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
121f0 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
12200 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
12210 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
12220 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
12230 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
12240 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
12250 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
12260 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
12270 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
12280 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
12290 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
122a0 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
122b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
122c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
122d0 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
122e0 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
122f0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
12300 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
12310 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
12320 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
12330 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
12340 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
12350 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
12380 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
12390 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
123a0 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
123b0 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
123c0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
123d0 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
123e0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
123f0 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
12400 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
12410 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
12420 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
12430 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
12440 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
12450 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12460 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
12470 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
12480 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
12490 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
124a0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
124b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
124c0 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
124d0 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
124e0 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
124f0 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
12500 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
12510 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
12520 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
12530 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
12540 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
12550 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
12560 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
12570 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
12580 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
12590 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
125a0 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
125b0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
125c0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
125d0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
125e0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
125f0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
12600 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
12610 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
12620 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
12630 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
12640 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
12650 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
12660 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
12670 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
12680 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
12690 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
126a0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
126b0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
126c0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
126d0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
126e0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
126f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
12700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12710 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
12720 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
12730 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
12740 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
12750 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
12760 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
12770 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
12780 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
12790 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
127a0 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
127b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
127c0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
127d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
127e0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
127f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12800 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
12820 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
12830 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 62  .          db->b
12840 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  Concurrent = 0;.
12850 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
12860 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
12870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12880 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
12890 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
128a0 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
128b0 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
128c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
128d0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
128e0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
128f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
12900 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
12910 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
12920 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
12930 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
12940 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
12950 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
12960 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
12970 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
12980 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12990 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
129a0 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
129b0 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
129c0 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
129d0 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
129e0 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
129f0 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
12a00 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
12a10 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
12a20 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
12a30 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12a40 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
12a50 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
12a60 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
12a70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
12a80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12a90 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
12aa0 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
12ab0 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
12ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12ad0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
12ae0 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
12af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12b10 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
12b20 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
12b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12b40 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
12b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12b60 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
12b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12b80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
12b90 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
12ba0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
12bb0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
12bc0 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
12bd0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
12be0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
12bf0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
12c00 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
12c10 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
12c20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
12c30 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
12c40 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
12c50 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
12c60 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
12c70 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
12c80 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
12c90 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
12ca0 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
12cb0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
12cc0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
12cd0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
12ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12cf0 28 72 63 20 26 20 30 78 46 46 29 3d 3d 53 51 4c  (rc & 0xFF)==SQL
12d00 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
12d10 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
12d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12d30 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12d40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12d50 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
12d80 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
12d90 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
12da0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
12db0 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OK);.          p
12dc0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12dd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12de0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
12df0 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
12e00 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
12e10 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
12e20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
12e30 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
12e40 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
12e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
12e60 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
12e70 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
12e80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12ea0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12eb0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
12ec0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
12ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ee0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
12ef0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
12f00 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
12f10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
12f20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12f30 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
12f40 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
12f50 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12f60 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12f70 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
12f80 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
12f90 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
12fb0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
12fc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
12fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12fe0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12ff0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13000 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
13010 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13020 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
13030 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
13040 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
13050 31 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 62  1;.        db->b
13060 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  Concurrent = 0;.
13070 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13080 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
13090 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
130a0 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
130b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
130c0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
130d0 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
130e0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
130f0 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13100 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
13110 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
13120 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
13130 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
13140 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
13150 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
13160 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
13170 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
13180 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
13190 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
131a0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
131b0 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
131c0 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
131d0 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
131e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
131f0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
13200 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13210 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
13220 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
13230 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
13240 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
13250 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13260 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
13270 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
13280 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
13290 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
132a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
132b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
132c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
132d0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
132e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
132f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
13300 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
13310 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
13320 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
13330 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
13340 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
13350 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
13360 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  = 1;.        db-
13370 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30  >bConcurrent = 0
13380 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
13390 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
133a0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
133b0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
133c0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
133d0 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
133e0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
133f0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
13400 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
13410 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
13420 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13430 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
13440 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
13450 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
13460 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
13470 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
13480 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
13490 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
134a0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
134b0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
134c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
134d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
134e0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
134f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13500 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
13510 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
13520 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
13530 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
13540 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
13550 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
13560 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
13570 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
13580 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
13590 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
135a0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
135b0 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
135c0 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
135d0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
135e0 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
135f0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
13600 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
13610 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
13620 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
13630 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
13640 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
13650 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
13660 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
13670 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
13680 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
13690 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
136a0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
136b0 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
136c0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
136d0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
136e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
136f0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
13700 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
13710 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
13720 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
13730 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
13740 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
13750 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
13760 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
13770 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
13780 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
13790 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
137a0 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
137b0 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
137c0 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
137d0 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
137e0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
137f0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
13800 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
13810 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
13820 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
13830 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
13840 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
13850 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
13860 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
13870 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
13880 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
13890 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
138a0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
138b0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
138c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
138d0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
138e0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
138f0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
13900 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
13910 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
13920 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
13930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
13940 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
13950 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
13960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13970 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
13980 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
13990 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
139a0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
139b0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
139c0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
139d0 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
139e0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
139f0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
13a00 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
13a10 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
13a20 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
13a30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13a40 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
13a50 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
13a60 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
13a70 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
13a80 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
13a90 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
13aa0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
13ab0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
13ac0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
13ad0 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
13ae0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13af0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
13b00 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
13b10 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
13b20 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
13b30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
13b50 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
13b60 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
13b70 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
13b80 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
13b90 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
13ba0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
13bb0 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
13bc0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
13bd0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
13be0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
13bf0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
13c00 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
13c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
13c20 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
13c30 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
13c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
13c50 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
13c60 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
13c70 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
13c80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
13c90 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
13ca0 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
13cb0 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
13cc0 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
13cd0 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
13ce0 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
13cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13d00 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13d10 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
13d20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13d30 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
13d40 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
13d50 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
13d60 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
13d70 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
13d80 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
13d90 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
13da0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
13db0 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
13dc0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
13dd0 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
13de0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13df0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
13e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
13e10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
13e20 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
13e30 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
13e40 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13e50 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
13e60 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
13e70 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
13e80 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
13e90 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
13ea0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
13eb0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
13ec0 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
13ed0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
13ee0 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
13ef0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
13f00 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
13f10 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
13f20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
13f30 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
13f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
13f50 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
13f60 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
13f70 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
13f80 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
13f90 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
13fa0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
13fb0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
13fc0 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
13fd0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
13fe0 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
13ff0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
14000 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
14010 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
14020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14030 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
14040 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14050 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
14060 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
14070 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
14080 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
14090 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
140a0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
140b0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
140c0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
140d0 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
140e0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
140f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14100 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
14110 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
14120 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
14130 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
14140 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
14150 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
14160 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
14170 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
14180 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
14190 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
141a0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
141b0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
141c0 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
141d0 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
141e0 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
141f0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
14200 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
14210 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
14220 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
14230 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
14240 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
14250 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
14260 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
14270 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
14280 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
14290 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
142a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
142b0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
142c0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
142d0 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
142e0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
142f0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
14300 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
14310 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
14320 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
14330 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
14340 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
14350 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
14360 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
14370 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
14380 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
14390 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
143a0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
143b0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
143c0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
143d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
143e0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
143f0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
14400 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
14410 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
14420 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14430 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
14440 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
14450 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
14460 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
14470 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
14480 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
14490 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
144a0 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
144b0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
144c0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
144d0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
144e0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
144f0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
14500 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
14510 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
14520 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
14530 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
14540 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
14550 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
14560 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
14570 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
14580 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
14590 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
145a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
145b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
145c0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
145d0 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
145e0 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
145f0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
14600 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
14610 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
14620 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
14630 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
14640 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
14650 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
14660 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
14670 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
14680 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
14690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
146a0 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
146b0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
146c0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
146d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
146e0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
146f0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
14700 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
14710 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
14720 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
14730 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
14740 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
14750 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
14760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
14770 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
14780 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
14790 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
147a0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
147b0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
147c0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
147d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
147e0 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
147f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
14800 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
14810 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
14820 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
14830 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
14840 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
14850 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
14860 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
14870 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
14880 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
14890 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
148a0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
148b0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
148c0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
148d0 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
148e0 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
148f0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
14900 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
14910 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
14920 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
14930 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
14940 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
14950 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
14960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
14970 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
14980 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
14990 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
149a0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
149b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
149c0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
149d0 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
149e0 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
149f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14a00 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
14a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14a20 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
14a30 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
14a40 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
14a50 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
14a60 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
14a70 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
14a80 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
14a90 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
14aa0 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
14ab0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
14ac0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
14ad0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14ae0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
14af0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
14b00 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
14b10 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
14b20 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
14b30 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
14b40 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
14b50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
14b60 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
14b70 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
14b80 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
14b90 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
14ba0 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
14bb0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
14bc0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
14bd0 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
14be0 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
14bf0 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
14c00 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
14c10 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
14c20 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
14c30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
14c40 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
14c50 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
14c60 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
14c70 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
14c80 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
14c90 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
14ca0 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
14cb0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
14cc0 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65  Data(Vdbe *pVdbe
14cd0 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
14ce0 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20  ask){.  AuxData 
14cf0 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70  **pp = &pVdbe->p
14d00 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65  AuxData;.  while
14d10 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
14d20 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
14d30 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
14d40 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
14d50 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
14d60 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
14d70 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
14d80 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
14d90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
14da0 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
14db0 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
14dc0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
14dd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
14de0 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
14df0 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
14e00 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
14e10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
14e20 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64  qlite3DbFree(pVd
14e30 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20  be->db, pAux);. 
14e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e50 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
14e60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14e70 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
14e80 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
14e90 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
14ea0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
14eb0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
14ec0 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
14ed0 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
14ee0 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
14ef0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
14f00 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
14f10 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
14f20 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
14f30 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
14f40 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
14f50 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
14f60 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
14f70 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
14f80 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
14f90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
14fa0 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
14fb0 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
14fc0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
14fd0 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
14fe0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
14ff0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
15000 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
15010 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
15020 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
15030 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
15040 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
15050 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
15060 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
15070 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
15080 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
15090 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
150a0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
150b0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
150c0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
150d0 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
150e0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
150f0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
15100 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
15110 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15120 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
15130 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
15140 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
15150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15160 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62  azVar[i]);.  vdb
15170 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
15180 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
15190 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
151a0 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
151b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
151c0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
151d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
151e0 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
151f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15200 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
15210 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b  TATUS.  for(i=0;
15220 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b   i<p->nScan; i++
15230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
15240 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
15250 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  n[i].zName);.  }
15260 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
15270 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
15280 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15290 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
152a0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
152b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
152c0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
152d0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
152e0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
152f0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
15300 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
15310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15320 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
15330 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
15340 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
15350 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
15360 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
15370 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
15380 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
15390 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
153a0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
153b0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
153c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
153d0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
153e0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
153f0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
15400 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
15410 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
15420 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
15430 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
15440 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
15450 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
15460 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
15470 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
15480 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
15490 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
154a0 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
154b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
154c0 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
154d0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
154e0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
154f0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
15500 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
15510 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
15520 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
15530 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
15540 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15550 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
15560 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
15570 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
15580 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
15590 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
155a0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
155b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
155c0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
155d0 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
155e0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
155f0 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
15600 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15610 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
15620 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15630 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
15640 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
15650 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
15660 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
15670 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
15680 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
15690 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
156a0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
156b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
156c0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
156d0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
156e0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
156f0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
15700 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
15710 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
15720 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
15730 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
15740 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
15750 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
15760 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
15770 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
15780 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
15790 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
157a0 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
157b0 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
157c0 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
157d0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
157e0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
157f0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
15800 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
15810 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
15820 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
15830 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
15840 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
15850 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
15860 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
15870 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f  ssert( p->pCurso
15880 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
15890 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
158a0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
158b0 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
158c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
158d0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
158e0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
158f0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
15900 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
15910 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
15920 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
15930 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
15940 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15950 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
15960 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
15970 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
15980 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
15990 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
159a0 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
159b0 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
159c0 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
159d0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
159e0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
159f0 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
15a00 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *p){.  if( sql
15a10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
15a20 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
15a30 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
15a40 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
15a50 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
15a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15a70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15a80 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
15a90 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
15aa0 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
15ab0 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
15ac0 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
15ad0 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
15ae0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
15af0 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
15b00 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
15b10 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
15b20 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
15b30 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
15b40 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
15b50 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
15b60 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
15b70 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
15b80 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
15b90 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
15ba0 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
15bb0 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
15bc0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
15bd0 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
15be0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
15bf0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
15c00 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
15c10 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
15c20 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
15c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
15c40 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
15c50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
15c60 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
15c70 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
15c80 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
15c90 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
15ca0 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
15cb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15cc0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
15cd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
15ce0 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
15cf0 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
15d00 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
15d10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
15d20 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
15d30 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66  eto(p);.  }.  if
15d40 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 26 26 20  ( p->pCursor && 
15d50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
15d60 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
15d70 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
15d80 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
15d90 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
15da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15db0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
15dc0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
15dd0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
15de0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15df0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
15e00 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
15e10 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15e20 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
15e30 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
15e40 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
15e50 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
15e60 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
15e70 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
15e80 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
15e90 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
15ea0 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
15eb0 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
15ec0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
15ed0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
15ee0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
15ef0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
15f00 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
15f10 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
15f20 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
15f30 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
15f40 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
15f50 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
15f60 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
15f70 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
15f80 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
15f90 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
15fa0 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
15fb0 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
15fc0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
15fd0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
15fe0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
15ff0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
16000 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
16010 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
16020 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
16030 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
16040 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
16050 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
16060 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
16070 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
16080 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
16090 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
160a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
160b0 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
160c0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
160d0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
160e0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
160f0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
16100 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
16110 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
16120 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
16130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
16140 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16150 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
16170 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
16180 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
161a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
161b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
161c0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
161d0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
161e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
161f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
16220 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
16230 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
16250 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
16260 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
16270 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
16280 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
16290 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
162a0 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
162d0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
162e0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
162f0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
16300 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
16310 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
16340 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
16350 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
16370 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
16380 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
16390 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
163c0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
163d0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
163e0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
163f0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
16400 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
16410 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
16420 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
16430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
16440 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
16450 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
16460 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
16470 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
16480 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
16490 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
164a0 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
164b0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
164c0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
164d0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
164e0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
164f0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
16500 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
16510 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
16520 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
16530 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
16540 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
16550 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
16560 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
16570 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
16580 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
16590 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
165a0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
165b0 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
165c0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
165d0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
165e0 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
165f0 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
16600 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
16610 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
16620 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
16630 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
16640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
16650 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
16660 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
16670 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d    return ((i&1)=
16680 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
16690 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75  t>=4) ? 8+(u32)u
166a0 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
166b0 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
166c0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
166d0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
166e0 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
166f0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
16700 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
16710 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
16720 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
16730 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
16740 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
16750 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
16760 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
16770 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
16780 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
16790 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
167a0 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ob) );.  assert(
167b0 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20   pMem->n>=0 );. 
167c0 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e   n = (u32)pMem->
167d0 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
167e0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
167f0 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
16800 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ero;.  }.  retur
16810 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
16820 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
16830 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
16840 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65  The sizes for se
16850 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20  rial types less 
16860 74 68 61 6e 20 31 32 0a 2a 2f 0a 73 74 61 74 69  than 12.*/.stati
16870 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
16880 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
16890 5b 5d 20 3d 20 7b 0a 20 20 30 2c 20 31 2c 20 32  [] = {.  0, 1, 2
168a0 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
168b0 20 30 2c 20 30 2c 20 30 2c 20 30 0a 7d 3b 0a 0a   0, 0, 0, 0.};..
168c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
168d0 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
168e0 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
168f0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
16900 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
16910 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
16920 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
16930 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
16940 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
16950 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
16960 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
16970 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
16980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
16990 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
169a0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
169b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
169c0 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
169d0 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
169e0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
169f0 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
16a00 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
16a10 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
16a20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
16a30 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
16a40 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
16a50 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
16a60 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
16a70 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
16a80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
16a90 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
16aa0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
16ab0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
16ac0 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
16ad0 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
16ae0 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
16af0 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
16b00 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
16b10 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
16b20 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
16b30 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
16b40 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
16b50 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
16b60 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
16b70 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
16b80 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
16b90 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
16ba0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
16bb0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
16bc0 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
16bd0 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
16be0 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
16bf0 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
16c00 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
16c10 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
16c20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
16c30 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
16c40 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
16c50 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
16c60 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
16c70 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
16c80 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
16c90 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
16ca0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
16cb0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
16cc0 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
16cd0 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
16ce0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
16cf0 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
16d00 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
16d10 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
16d20 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
16d30 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
16d40 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
16d50 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
16d60 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
16d70 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
16d80 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
16d90 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
16da0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
16db0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
16dc0 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
16dd0 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
16de0 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
16df0 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
16e00 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
16e10 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
16e20 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
16e30 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
16e40 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
16e50 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
16e60 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
16e70 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
16e80 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
16e90 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
16ea0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
16eb0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
16ec0 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
16ed0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
16ee0 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
16ef0 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
16f00 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
16f10 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
16f20 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
16f30 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
16f40 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
16f50 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
16f60 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
16f70 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
16f80 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
16f90 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
16fa0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
16fb0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
16fc0 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
16fd0 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
16fe0 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
16ff0 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
17000 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
17010 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
17020 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
17030 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
17040 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17050 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
17060 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
17070 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
17080 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
17090 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
170a0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
170b0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
170c0 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
170d0 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
170e0 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
170f0 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
17100 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
17110 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
17120 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
17130 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
17140 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
17150 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
17160 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
17170 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
17180 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
17190 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
171a0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
171b0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
171c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
171d0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
171e0 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
171f0 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
17200 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17210 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
17220 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
17230 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
17240 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
17250 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
17260 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72  sponsible.** for
17270 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75   allocating enou
17280 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b  gh space to buf[
17290 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  ] to hold the en
172a0 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c  tire field, excl
172b0 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20  usive.** of the 
172c0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79  pMem->u.nZero by
172d0 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65  tes for a MEM_Ze
172e0 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
172f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
17300 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
17310 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
17320 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
17330 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
17340 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
17350 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
17360 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
17370 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
17380 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
17390 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
173a0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
173b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
173c0 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a  t(u8 *buf, Mem *
173d0 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c  pMem, u32 serial
173e0 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65  _type){.  u32 le
173f0 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
17400 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
17410 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
17420 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
17430 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
17440 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20  .    u32 i;.    
17450 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
17460 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
17470 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
17480 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
17490 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
174a0 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c  (&v, &pMem->u.r,
174b0 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
174c0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
174d0 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
174e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
174f0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
17500 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
17510 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17520 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17530 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e];.    assert( 
17540 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
17550 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
17560 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
17570 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
17580 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
17590 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
175a0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
175b0 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
175c0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
175d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
175e0 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
175f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
17600 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
17610 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
17620 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
17630 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17640 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
17650 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
17660 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
17670 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
17680 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
17690 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
176a0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
176b0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
176c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
176d0 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
176e0 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
176f0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
17700 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
17710 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
17720 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
17730 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
17740 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
17750 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
17760 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
17770 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
17780 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
17790 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
177a0 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
177b0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
177c0 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
177d0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
177e0 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
177f0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
17800 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
17810 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
17820 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
17830 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
17840 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
17850 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
17860 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
17870 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
17880 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
17890 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
178a0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
178b0 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
178c0 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
178d0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
178e0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
178f0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
17900 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17910 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
17920 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17930 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
17940 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
17950 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
17960 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
17970 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
17980 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
17990 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
179a0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
179b0 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
179c0 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
179d0 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
179e0 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
179f0 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
17a00 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
17a10 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
17a20 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
17a30 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
17a40 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
17a50 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
17a60 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
17a70 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
17a80 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
17a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
17aa0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
17ab0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
17ac0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
17ae0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
17af0 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
17b00 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
17b10 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
17b20 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
17b30 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
17b40 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
17b50 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
17b60 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
17b70 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17b80 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
17b90 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
17ba0 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
17bb0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
17bc0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
17bd0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
17be0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
17bf0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17c00 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
17c10 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17c20 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
17c30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17c40 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
17c50 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
17c60 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
17c70 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
17c80 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
17c90 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
17ca0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
17cb0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
17cc0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17cd0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
17ce0 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
17cf0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
17d00 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
17d10 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
17d20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
17d30 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
17d40 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
17d50 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
17d60 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
17d70 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
17d80 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
17d90 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
17da0 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
17db0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
17dc0 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
17dd0 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
17de0 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
17df0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
17e00 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
17e10 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
17e20 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
17e30 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
17e40 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
17e50 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
17e60 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
17e70 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
17e80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
17e90 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
17ea0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
17eb0 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
17ec0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
17ed0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
17ee0 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
17ef0 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
17f00 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
17f10 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
17f20 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
17f30 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
17f40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
17f50 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
17f60 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
17f70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17f80 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
17f90 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
17fa0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
17fb0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
17fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17fd0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
17fe0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
17ff0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
18020 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
18030 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
18040 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
18050 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
18060 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
18070 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
18080 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
18090 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
180a0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
180b0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
180c0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
180d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
180e0 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
180f0 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
18100 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
18110 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
18120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18130 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
18140 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18150 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
18160 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
18170 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
18180 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
18190 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
181a0 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
181b0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
181c0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
181d0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
181e0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
181f0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
18200 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
18210 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
18220 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
18230 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
18240 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18250 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
18260 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
18270 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
18280 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
18290 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
182a0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
182b0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
182c0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
182d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
182e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
182f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
18300 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
18310 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
18320 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
18330 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
18340 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18350 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
18360 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
18370 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
18380 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
18390 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
183a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
183b0 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
183c0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
183d0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
183e0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
183f0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
18400 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
18410 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
18420 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
18430 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
18440 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
18450 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18460 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
18470 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
18480 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
18490 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
184a0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
184b0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
184c0 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
184d0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
184e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
184f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18500 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
18510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
18520 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18530 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
18540 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
18550 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
18560 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
18570 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
18580 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
18590 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
185a0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
185b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
185c0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
185d0 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
185e0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
185f0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
18600 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
18610 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
18620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18630 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
18640 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
18650 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
18660 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
18670 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
18680 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
18690 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
186a0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
186b0 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
186c0 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
186d0 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
186e0 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
186f0 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
18700 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
18710 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
18720 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
18730 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
18740 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
18750 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
18760 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
18770 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
18780 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
18790 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
187a0 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
187b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
187c0 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
187d0 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
187e0 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
187f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
18800 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
18810 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
18820 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
18830 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
18840 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
18850 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
18860 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
18870 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
18880 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
18890 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
188a0 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
188b0 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
188c0 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
188d0 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
188e0 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
188f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
18900 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
18910 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
18920 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
18930 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
18940 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
18950 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
18960 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
18970 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
18980 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
18990 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
189a0 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
189b0 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
189c0 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
189d0 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
189e0 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
189f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
18a00 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
18a10 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
18a20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
18a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18a50 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
18a60 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
18a70 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
18a80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
18a90 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
18aa0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
18ab0 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
18ac0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
18ad0 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
18ae0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
18af0 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
18b00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
18b10 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
18b20 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
18b30 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
18b40 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
18b50 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
18b60 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
18b70 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
18b80 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
18b90 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
18ba0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
18bb0 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
18bc0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
18bd0 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
18be0 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
18bf0 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
18c00 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
18c10 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
18c20 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
18c30 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
18c40 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
18c50 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
18c60 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
18c70 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
18c80 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
18c90 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
18ca0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
18cb0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
18cc0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
18cd0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
18ce0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
18cf0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
18d00 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
18d10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d30 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
18d40 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
18d50 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
18d80 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
18d90 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
18dc0 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
18dd0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
18de0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
18df0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
18e00 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
18e10 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
18e20 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
18e30 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
18e40 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
18e50 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
18e60 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
18e90 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
18ea0 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
18eb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ee0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
18ef0 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
18f00 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
18f10 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
18f20 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
18f30 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
18f40 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
18f50 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
18f60 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
18f70 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
18f80 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
18f90 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
18fa0 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
18fb0 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
18fc0 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
18fd0 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
18fe0 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
18ff0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
19000 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
19010 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
19020 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
19030 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
19040 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
19050 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
19060 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
19070 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
19080 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
19090 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
190a0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
190b0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
190c0 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
190d0 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
190e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
190f0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
19100 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
19110 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
19120 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
19130 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
19140 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
19150 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
19160 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
19170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19180 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
19190 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
191a0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
191b0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
191c0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
191d0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
191e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
191f0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
19200 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
19210 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
19220 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
19230 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
19240 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
19250 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
19260 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
19270 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
19280 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
19290 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
192a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
192b0 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
192c0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
192d0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
192e0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
192f0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
19300 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
19310 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
19320 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
19330 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
19340 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
19350 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
19360 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
19370 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
19380 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
19390 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
193a0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
193b0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
193c0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
193d0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
193e0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
193f0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
19420 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
19430 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
19440 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19460 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
19470 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
19480 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
19490 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
194a0 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
194b0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
194c0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
194d0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
194e0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
194f0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
19500 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
19510 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
19520 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
19530 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
19540 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
19550 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
19560 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
19570 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
19580 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
19590 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
195a0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
195b0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
195c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
195d0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
195e0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
195f0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
19600 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
19610 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
19620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
19630 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
19640 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
19650 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
19660 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
19670 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
19680 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
19690 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
196a0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
196b0 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
196c0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
196d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
196e0 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
196f0 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
19700 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
19710 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
19720 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
19730 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
19740 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
19750 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
19760 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
19770 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
19780 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
19790 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
197a0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
197b0 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
197c0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
197d0 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
197e0 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
197f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
19800 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
19810 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
19820 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
19830 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
19840 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
19850 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
19860 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
19870 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
19880 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
19890 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
198a0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
198b0 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
198c0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
198d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
198e0 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
198f0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
19900 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
19910 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
19920 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
19930 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
19940 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
19950 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
19960 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
19970 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
19980 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
19990 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
199a0 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
199b0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
199c0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
199d0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
199e0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
199f0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
19a00 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
19a10 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
19a20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
19a30 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
19a40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19a50 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
19a60 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
19a70 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
19a80 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
19a90 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
19aa0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
19ab0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
19ac0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19ad0 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
19ae0 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
19af0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
19b00 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
19b10 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
19b20 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
19b30 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
19b40 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
19b50 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
19b60 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
19b70 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
19b80 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
19b90 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
19ba0 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
19bb0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
19bc0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
19bd0 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
19be0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
19bf0 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
19c00 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
19c10 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
19c20 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
19c30 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
19c40 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
19c50 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
19c60 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
19c70 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
19c80 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
19c90 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
19ca0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
19cb0 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
19cc0 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
19cd0 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
19ce0 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
19cf0 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
19d00 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
19d10 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
19d20 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
19d30 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
19d40 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
19d50 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
19d60 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
19d70 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
19d80 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
19d90 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
19da0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
19db0 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
19dc0 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
19dd0 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
19de0 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
19df0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
19e00 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
19e10 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
19e20 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
19e30 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
19e40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
19e50 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
19e60 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
19e70 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
19e80 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
19e90 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
19ea0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
19eb0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19ec0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
19ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19ee0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
19ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
19f00 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
19f10 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
19f20 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
19f30 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
19f40 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
19f50 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
19f60 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
19f70 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
19f80 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
19f90 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
19fa0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
19fb0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
19fc0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
19fd0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
19fe0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
19ff0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1a000 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1a010 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1a020 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1a030 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1a040 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1a050 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1a060 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1a070 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1a080 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1a090 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1a0a0 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1a0b0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1a0c0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1a0d0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1a0e0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1a0f0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1a100 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
1a110 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
1a120 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1a130 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a140 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1a150 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
1a160 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
1a170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a180 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1a190 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
1a1a0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
1a1b0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1a1c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1a1d0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1a1e0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
1a1f0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
1a200 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
1a210 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a220 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
1a230 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
1a240 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
1a250 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
1a260 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1a270 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1a280 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1a290 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1a2a0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1a2b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1a2c0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1a2d0 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1a2e0 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1a2f0 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1a300 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1a310 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1a320 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1a330 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1a340 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1a350 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1a360 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1a370 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1a380 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1a390 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1a3a0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1a3b0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1a3c0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1a3d0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1a3e0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1a3f0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1a400 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1a410 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1a420 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1a430 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1a440 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1a450 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1a460 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1a470 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1a480 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1a490 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1a4a0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1a4b0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1a4c0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1a4d0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1a4e0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1a4f0 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1a500 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1a510 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1a520 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1a530 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1a540 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1a550 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1a560 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1a570 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1a580 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1a590 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1a5a0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1a5b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1a5c0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1a5d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1a5e0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1a5f0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1a600 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1a610 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1a620 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1a630 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1a640 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1a650 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1a660 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1a670 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1a680 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1a690 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1a6a0 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1a6b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1a6c0 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46   + pKeyInfo->nXF
1a6d0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
1a6e0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
1a6f0 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
1a700 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1a710 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
1a720 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1a730 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
1a740 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1a750 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
1a760 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
1a770 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
1a780 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
1a790 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
1a7a0 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
1a7b0 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
1a7c0 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1a7d0 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20  .nXField values 
1a7e0 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
1a7f0 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
1a800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
1a810 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1a820 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
1a830 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
1a840 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1a850 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
1a860 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1a870 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1a880 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1a890 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1a8a0 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1a8b0 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1a8c0 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1a8d0 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1a8e0 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1a8f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a900 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1a910 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1a920 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1a930 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1a940 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1a950 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1a960 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1a970 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1a980 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1a990 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1a9a0 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1a9b0 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1a9c0 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1a9d0 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1a9e0 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1a9f0 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1aa00 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1aa10 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1aa20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1aa30 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1aa40 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1aa50 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1aa60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1aa70 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1aa80 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1aa90 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1aaa0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1aab0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1aac0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1aad0 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1aae0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1aaf0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1ab00 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1ab10 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1ab20 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1ab30 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1ab40 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1ab50 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1ab60 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1ab70 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1ab80 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1ab90 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1aba0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1abb0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1abc0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1abd0 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1abe0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1abf0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1ac20 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1ac30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1ac40 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1ac50 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1ac60 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1ac70 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1ac80 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1ac90 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1aca0 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1acb0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1acc0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1acd0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1ace0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1acf0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1ad00 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1ad10 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1ad20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1ad30 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1ad40 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
1ad50 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1ad60 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1ad70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1ad80 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1ad90 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1ada0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1adb0 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1adc0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1add0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1ade0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1adf0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1ae00 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1ae10 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1ae20 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1ae30 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1ae40 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1ae50 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1ae60 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1ae70 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
1ae80 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
1ae90 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1aea0 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1aeb0 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1aec0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1aed0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
1aee0 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
1aef0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
1af00 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
1af10 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
1af20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1af30 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1af40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1af50 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1af60 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
1af70 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
1af80 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1af90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
1afa0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1afb0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
1afc0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
1afd0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1afe0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1aff0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
1b000 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1b010 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1b020 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
1b030 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
1b040 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
1b050 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
1b060 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
1b070 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
1b080 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  lessor..*/.stati
1b090 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1b0a0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
1b0b0 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
1b0c0 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
1b0d0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
1b0e0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1b0f0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e  z, pB2->z, pB1->
1b100 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e  n>pB2->n ? pB2->
1b110 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69  n : pB1->n);.  i
1b120 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1b130 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e  .  return pB1->n
1b140 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f   - pB2->n;.}.../
1b150 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1b160 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1b170 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1b180 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1b190 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1b1a0 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1b1b0 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1b1c0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1b1d0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1b1e0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1b1f0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1b200 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1b210 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1b220 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1b230 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1b240 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1b250 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1b260 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1b270 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1b280 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1b290 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1b2a0 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1b2b0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1b2c0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1b2d0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1b2e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1b2f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1b300 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1b310 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1b320 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1b330 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1b340 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1b350 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1b360 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1b370 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1b380 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1b390 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1b3a0 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1b3b0 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1b3c0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1b3d0 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1b3e0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1b3f0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1b400 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1b410 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1b420 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1b430 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1b440 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1b450 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1b460 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1b470 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1b480 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1b490 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1b4a0 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20  is a number and 
1b4b0 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1b4c0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  , the number is 
1b4d0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1b4e0 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20  th are numbers, 
1b4f0 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73  compare as reals
1b500 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61   if one is a rea
1b510 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72  l, or as integer
1b520 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76  s.  ** if both v
1b530 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65  alues are intege
1b540 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  rs..  */.  if( c
1b550 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1b560 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1b570 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
1b580 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28  1, r2;.    if( (
1b590 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1b5a0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1b5b0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1b5c0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1b5d0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1b5e0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1b5f0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1b600 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
1b610 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1b620 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1b630 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
1b640 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20   = pMem1->u.r;. 
1b650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31     }else if( (f1
1b660 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1b670 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62        r1 = (doub
1b680 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20  le)pMem1->u.i;. 
1b690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b6a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1b6b0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1b6c0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1b6d0 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e    r2 = pMem2->u.
1b6e0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1b6f0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1b700 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
1b710 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
1b720 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1b730 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1b740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
1b750 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
1b760 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
1b770 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
1b780 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1b790 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1b7a0 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1b7b0 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1b7c0 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1b7d0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1b7e0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1b7f0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1b800 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1b810 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1b820 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1b830 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1b840 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1b850 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1b860 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b870 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1b880 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1b890 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1b8a0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1b8b0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1b8c0 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1b8d0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1b8e0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1b8f0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1b900 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1b910 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1b920 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1b930 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1b940 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1b950 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1b960 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1b970 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1b980 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1b990 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1b9a0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b9b0 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1b9c0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1b9d0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1b9e0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1b9f0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1ba00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1ba10 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1ba20 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1ba30 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1ba40 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1ba50 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1ba60 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1ba70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1ba80 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1ba90 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1baa0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1bab0 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1bac0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1bad0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1bae0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1baf0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1bb00 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1bb10 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1bb20 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1bb30 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1bb40 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1bb50 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1bb60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1bb70 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1bb80 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1bb90 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1bba0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1bbb0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1bbc0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1bbd0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1bbe0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1bbf0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1bc00 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1bc10 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1bc20 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1bc30 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1bc40 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1bc50 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1bc60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1bc70 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1bc80 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1bc90 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1bca0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1bcb0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1bcc0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1bcd0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1bce0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1bcf0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1bd00 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1bd10 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1bd20 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1bd30 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1bd40 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1bd50 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1bd60 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1bd70 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1bd80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1bd90 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1bda0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1bdb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1bdc0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1bdd0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1bde0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1bdf0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1be00 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1be10 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1be20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1be30 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1be40 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1be50 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1be60 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1be70 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1be80 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1be90 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1bea0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1beb0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1bec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1bed0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1bee0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1bef0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1bf00 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1bf10 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1bf20 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1bf30 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1bf40 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1bf50 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1bf60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1bf70 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1bf80 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1bf90 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1bfa0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1bfb0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1bfc0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1bfd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1bfe0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1bff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c000 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1c010 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1c020 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1c030 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1c040 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1c050 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1c060 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1c070 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1c080 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1c090 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1c0a0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c0b0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1c0c0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1c0d0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1c0e0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1c0f0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1c100 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1c110 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1c120 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1c130 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1c140 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1c150 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1c160 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1c170 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1c180 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1c190 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1c1a0 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1c1b0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1c1c0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1c1d0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1c1e0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1c1f0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1c200 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1c210 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1c220 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1c230 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1c240 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1c250 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1c260 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1c270 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1c280 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1c290 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1c2a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1c2b0 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1c2c0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1c2d0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1c2e0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1c2f0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1c300 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1c310 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1c320 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1c330 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1c340 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1c350 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1c360 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1c370 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1c380 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1c390 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1c3a0 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1c3b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1c3c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c3d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1c3e0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1c3f0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1c400 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1c410 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1c420 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1c430 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1c440 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1c450 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1c460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1c470 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1c480 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1c490 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1c4c0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1c4d0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1c4e0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c510 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1c520 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1c530 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c550 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1c560 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1c570 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1c5a0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1c5b0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1c5c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c5e0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1c5f0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1c600 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1c610 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1c620 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1c630 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1c640 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1c650 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1c660 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c670 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1c680 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c690 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1c6a0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1c6b0 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1c6c0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1c6d0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1c6e0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1c6f0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1c700 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1c710 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1c720 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1c730 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1c740 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1c750 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1c760 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1c770 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1c780 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1c790 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1c7a0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1c7b0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1c7c0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1c7d0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1c7e0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1c7f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c800 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1c810 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1c820 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1c830 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1c840 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1c850 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1c860 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1c870 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1c880 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1c890 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1c8a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c8b0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1c8c0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1c8d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1c8e0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1c8f0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1c900 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1c910 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1c920 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1c930 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1c940 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1c950 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1c960 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1c970 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1c980 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1c990 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1c9a0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1c9b0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1c9c0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1c9d0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1c9e0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1c9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1ca00 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1ca10 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1ca20 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1ca30 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1ca40 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1ca50 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1ca60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1ca70 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1ca80 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1ca90 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1caa0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1cab0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1cac0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1cad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cae0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1caf0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1cb00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1cb10 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1cb20 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1cb30 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1cb40 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28    double rhs = (
1cb50 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69  double)pRhs->u.i
1cb60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cb70 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1cb80 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1cb90 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1cba0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1cbb0 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  .u.r<rhs ){.    
1cbc0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1cbd0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1cbe0 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b   mem1.u.r>rhs ){
1cbf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1cc00 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1cc10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cc20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1cc30 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1cc40 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1cc50 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1cc60 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1cc70 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1cc80 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1cc90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1cca0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ccb0 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1ccc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1ccd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cce0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ccf0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1cd00 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1cd10 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1cd20 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1cd30 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1cd40 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1cd50 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1cd60 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  10 ){.        /*
1cd70 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32   Serial types 12
1cd80 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20   or greater are 
1cd90 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
1cda0 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a  s (greater than.
1cdb0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1cdc0 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e  rs). Types 10 an
1cdd0 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74  d 11 are current
1cde0 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72  ly "reserved for
1cdf0 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20   future .       
1ce00 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20   ** use", so it 
1ce10 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d  doesn't really m
1ce20 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72  atter what the r
1ce30 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
1ce40 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
1ce50 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20  hem to numberic 
1ce60 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a  values are.  */.
1ce70 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1ce80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ce90 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1cea0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ceb0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1cec0 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
1ced0 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b  rhs = pRhs->u.r;
1cee0 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
1cef0 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lhs;.        sql
1cf00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1cf10 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1cf20 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1cf30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1cf40 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1cf50 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1cf60 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20   mem1.u.r;.     
1cf70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf80 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c      lhs = (doubl
1cf90 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  e)mem1.u.i;.    
1cfa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1cfb0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1cfc0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1cfd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1cfe0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1cff0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1d000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d010 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d020 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1d030 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1d040 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1d050 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1d060 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d070 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1d080 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1d090 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1d0a0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1d0b0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1d0c0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1d0d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1d0e0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1d0f0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1d100 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1d110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d120 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1d130 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1d140 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1d150 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1d160 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1d170 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1d180 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1d190 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1d1a0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1d1b0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1d1c0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1d1d0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1d1e0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1d1f0 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1d200 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d210 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d220 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d230 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1d240 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1d250 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1d260 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
1d270 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
1d280 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1d290 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
1d2a0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1d2c0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
1d2d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1d2e0 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
1d2f0 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
1d300 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
1d310 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
1d320 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
1d330 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
1d340 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
1d350 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
1d360 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1d370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d380 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1d390 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
1d3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1d3b0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1d3c0 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1d3d0 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1d3e0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1d3f0 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
1d400 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
1d410 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d420 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
1d430 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1d440 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1d450 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
1d460 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1d470 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1d480 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1d490 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1d4a0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1d4b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1d4c0 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
1d4d0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1d4e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1d4f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d500 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
1d510 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1d520 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1d530 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1d540 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
1d550 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1d560 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1d570 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
1d580 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1d590 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
1d5a0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1d5b0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1d5c0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1d5d0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1d5e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1d5f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d610 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1d620 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d630 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1d640 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1d650 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1d660 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1d670 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1d680 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1d690 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1d6a0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1d6b0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1d6c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d6d0 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1d6e0 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1d6f0 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1d700 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1d710 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1d720 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1d730 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1d740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1d750 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1d760 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1d770 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1d780 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1d790 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d7a0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d7b0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1d7c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d7d0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1d7e0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1d7f0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1d800 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d810 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1d820 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1d830 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1d840 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1d850 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1d860 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1d870 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1d880 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1d890 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1d8a0 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1d8b0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1d8c0 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1d8d0 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1d8e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1d8f0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1d900 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1d910 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1d920 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1d930 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1d940 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1d950 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1d960 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1d970 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1d980 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1d990 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1d9a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1d9b0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d9c0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1d9d0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1d9e0 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1d9f0 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1da00 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1da10 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1da20 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1da30 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1da40 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1da50 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1da60 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1da70 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1da80 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
1da90 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1daa0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
1dab0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1dac0 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
1dad0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1dae0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1daf0 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
1db00 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
1db10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1db20 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
1db30 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1db40 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1db50 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1db60 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1db70 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
1db80 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
1db90 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1dba0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1dbb0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1dbc0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1dbd0 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
1dbe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1dbf0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
1dc00 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
1dc10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dc20 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
1dc30 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1dc40 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
1dc50 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
1dc60 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
1dc70 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
1dc80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1dc90 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1dca0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
1dcb0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
1dcc0 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
1dcd0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
1dce0 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
1dcf0 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
1dd00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
1dd10 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
1dd20 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
1dd30 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
1dd40 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
1dd50 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
1dd60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1dd70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1dd80 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
1dd90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1dda0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1ddb0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1ddc0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1ddd0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1dde0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
1ddf0 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
1de00 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
1de10 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
1de20 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
1de30 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
1de40 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
1de50 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
1de60 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
1de70 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32    i64 v = pPKey2
1de80 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
1de90 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62   i64 lhs;..  vdb
1dea0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1deb0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
1dec0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1ded0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
1dee0 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
1def0 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
1df00 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1df10 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1df20 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1df30 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
1df40 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1df50 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
1df60 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1df70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1df80 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1df90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1dfa0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
1dfb0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1dfc0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1dfd0 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1dfe0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1dff0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1e000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e010 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1e020 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1e030 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1e040 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
1e050 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1e070 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1e080 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e090 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1e0a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1e0b0 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
1e0c0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e0d0 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
1e0e0 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1e0f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e100 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1e110 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e120 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
1e130 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1e140 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1e150 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1e160 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1e170 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1e180 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1e1a0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1e1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e1c0 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
1e1d0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1e1e0 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
1e1f0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e200 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
1e210 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1e220 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1e230 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
1e240 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
1e250 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1e260 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e270 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1e280 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
1e290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e2a0 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
1e2b0 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
1e2c0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
1e2d0 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
1e2e0 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
1e2f0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
1e300 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
1e310 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
1e320 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
1e330 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
1e340 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
1e350 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
1e360 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
1e370 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
1e380 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
1e390 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
1e3a0 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
1e3b0 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
1e3c0 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
1e3d0 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
1e3e0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
1e3f0 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
1e400 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
1e410 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
1e420 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
1e430 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
1e440 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
1e450 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
1e460 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
1e470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1e480 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e490 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1e4a0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
1e4b0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1e4c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e4d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e4e0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1e4f0 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
1e500 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
1e510 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e520 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
1e530 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
1e540 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1e550 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
1e560 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
1e570 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1e580 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1e590 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1e5a0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
1e5b0 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
1e5c0 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
1e5d0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
1e5e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1e5f0 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
1e600 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
1e610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1e620 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1e630 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
1e640 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
1e650 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
1e660 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
1e670 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
1e680 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
1e690 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
1e6a0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e6b0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a  default_rc;.  }.
1e6c0 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
1e6d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1e6e0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1e6f0 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
1e700 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1e710 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e720 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
1e730 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1e740 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e750 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
1e760 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
1e770 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1e780 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
1e790 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
1e7a0 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
1e7b0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e7c0 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
1e7d0 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
1e7e0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1e7f0 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
1e800 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
1e810 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
1e820 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
1e830 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1e840 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1e850 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
1e860 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1e870 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1e880 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1e890 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1e8a0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1e8b0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1e8c0 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
1e8d0 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
1e8e0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
1e8f0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64    int res;..  vd
1e900 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1e910 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
1e920 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1e930 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
1e940 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1e950 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
1e960 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
1e970 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1e980 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1e990 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
1e9a0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1e9b0 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
1e9c0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1e9d0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1e9e0 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
1e9f0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
1ea00 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
1ea10 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
1ea20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1ea30 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
1ea40 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
1ea50 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
1ea60 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
1ea70 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
1ea80 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
1ea90 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
1eaa0 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
1eab0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1eac0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1ead0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1eae0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
1eaf0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1eb00 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
1eb10 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1eb20 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
1eb30 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
1eb40 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
1eb50 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
1eb60 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
1eb70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
1eb80 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
1eb90 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
1eba0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1ebb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ebc0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1ebd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
1ebe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1ebf0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1ec00 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1ec10 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1ec20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec30 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1ec40 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1ec50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec60 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1ec70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
1ec80 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1ec90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eca0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1ecb0 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
1ecc0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1ecd0 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
1ece0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1ecf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
1ed00 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1ed10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1ed20 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1ed30 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1ed40 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1ed50 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20   res).       || 
1ed60 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
1ed70 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
1ed80 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1ed90 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
1eda0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1edb0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1edc0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
1edd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ede0 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
1edf0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
1ee00 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
1ee10 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
1ee20 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
1ee30 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
1ee40 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
1ee50 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
1ee60 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
1ee70 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
1ee80 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
1ee90 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
1eea0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1eeb0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
1eec0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
1eed0 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
1eee0 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
1eef0 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
1ef00 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
1ef10 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
1ef20 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
1ef30 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
1ef40 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
1ef50 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
1ef60 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
1ef70 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
1ef80 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
1ef90 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
1efa0 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
1efb0 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
1efc0 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
1efd0 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
1efe0 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
1eff0 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
1f000 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
1f010 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1f020 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
1f030 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
1f040 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
1f050 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
1f060 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
1f070 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1f080 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
1f090 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
1f0a0 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
1f0b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f0c0 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
1f0d0 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
1f0e0 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
1f0f0 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
1f100 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
1f110 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
1f120 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
1f130 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
1f140 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
1f150 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
1f160 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
1f170 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
1f180 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
1f190 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
1f1a0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
1f1b0 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
1f1c0 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
1f1d0 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
1f1e0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
1f1f0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1f200 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  ld)<=13 ){.    i
1f210 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
1f220 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
1f230 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
1f240 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
1f250 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
1f260 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
1f270 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1f280 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
1f290 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
1f2a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1f2b0 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
1f2c0 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
1f2d0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1f2e0 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
1f2f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1f300 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
1f310 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f320 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1f330 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1f340 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
1f350 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
1f360 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
1f370 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
1f380 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
1f390 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
1f3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1f3b0 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
1f3c0 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
1f3d0 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
1f3e0 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
1f3f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1f400 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1f410 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
1f420 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
1f430 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
1f440 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
1f450 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1f460 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
1f470 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
1f480 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
1f490 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
1f4a0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
1f4b0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
1f4c0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1f4d0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
1f4e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
1f4f0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
1f500 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
1f510 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
1f520 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
1f530 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
1f540 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
1f550 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
1f560 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
1f570 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
1f580 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
1f590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1f5a0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
1f5b0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
1f5c0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
1f5d0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
1f5e0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
1f5f0 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
1f600 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f610 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
1f620 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
1f630 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
1f640 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
1f650 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
1f660 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
1f670 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
1f680 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
1f690 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
1f6a0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1f6b0 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
1f6c0 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
1f6d0 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
1f6e0 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
1f6f0 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
1f700 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
1f710 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
1f720 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
1f730 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
1f740 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1f750 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
1f760 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
1f770 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
1f780 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
1f790 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
1f7a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
1f7b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f7c0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
1f7d0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
1f7e0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
1f7f0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
1f800 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
1f810 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1f820 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20   );     /* pCur 
1f830 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
1f840 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
1f850 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
1f860 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
1f870 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
1f880 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
1f890 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
1f8a0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
1f8b0 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
1f8c0 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  x entry */.  sql
1f8d0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1f8e0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
1f8f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
1f900 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
1f910 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
1f920 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
1f930 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1f940 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1f950 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
1f960 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
1f970 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
1f980 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
1f990 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
1f9a0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
1f9b0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
1f9c0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
1f9d0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
1f9e0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
1f9f0 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
1fa00 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
1fa10 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1fa20 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
1fa30 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
1fa40 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
1fa50 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
1fa60 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
1fa70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1fa80 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
1fa90 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
1faa0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
1fab0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
1fac0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
1fad0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
1fae0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1faf0 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
1fb00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
1fb10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1fb20 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
1fb30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1fb40 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
1fb50 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1fb60 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
1fb70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
1fb80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1fb90 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
1fba0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1fbb0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
1fbc0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
1fbd0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
1fbe0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
1fbf0 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
1fc00 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
1fc10 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
1fc20 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53  Rowid = sqlite3S
1fc30 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79  mallTypeSizes[ty
1fc40 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74  peRowid];.  test
1fc50 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
1fc60 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
1fc70 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1fc80 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
1fc90 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
1fca0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1fcb0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1fcc0 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
1fcd0 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
1fce0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1fcf0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
1fd00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1fd10 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
1fd20 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
1fd30 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
1fd40 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
1fd50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1fd60 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1fd70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1fd80 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1fd90 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1fda0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
1fdb0 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
1fdc0 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
1fdd0 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
1fde0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
1fdf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
1fe00 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
1fe10 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
1fe20 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
1fe30 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
1fe40 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fe50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fe60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1fe70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1fe80 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
1fe90 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1fea0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
1feb0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
1fec0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
1fed0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
1fee0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
1fef0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
1ff00 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
1ff10 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1ff20 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
1ff30 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1ff40 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
1ff50 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
1ff60 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1ff70 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
1ff80 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
1ff90 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
1ffa0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
1ffb0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
1ffc0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
1ffd0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
1ffe0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
1fff0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
20000 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
20010 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
20020 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
20030 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
20040 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
20050 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
20060 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
20070 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
20080 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
20090 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
200a0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
200b0 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
200c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200e0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
200f0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
20100 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
20110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20120 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
20130 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
20140 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20150 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
20160 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
20170 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
20180 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
201b0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
201c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
201d0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
201e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
201f0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
20200 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
20210 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
20220 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
20230 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
20240 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
20250 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
20260 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
20270 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
20280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20290 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
202a0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
202b0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
202c0 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
202d0 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
202e0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
202f0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
20300 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
20310 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
20320 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
20330 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
20340 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
20350 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
20360 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
20370 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
20380 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
20390 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
203a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
203b0 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
203c0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
203d0 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
203e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
203f0 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
20400 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  rsor, 0, (u32)nC
20410 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
20420 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
20440 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
20450 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20460 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
20470 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
20480 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
20490 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
204a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
204b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
204c0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
204d0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
204e0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
204f0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
20500 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
20510 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
20520 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
20530 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
20540 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
20550 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
20560 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20570 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
20580 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
20590 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
205a0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
205b0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
205c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
205d0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
205e0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
205f0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
20600 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
20610 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
20620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20630 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
20640 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
20650 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
20660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
20670 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
20680 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
20690 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
206a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
206b0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
206c0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
206d0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
206e0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
206f0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
20700 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
20710 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
20720 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
20730 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
20740 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
20750 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
20760 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
20770 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
20780 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
20790 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
207a0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
207b0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
207c0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
207d0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
207e0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
207f0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
20800 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
20810 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
20820 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
20830 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
20840 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
20850 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
20860 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
20870 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
20880 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
20890 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
208a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
208b0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
208c0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
208d0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
208e0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
208f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
20900 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
20910 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
20920 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
20930 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
20940 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
20950 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
20960 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
20970 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
20980 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
20990 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
209a0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
209b0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
209c0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
209d0 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
209e0 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
209f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
20a00 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
20a10 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
20a20 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
20a30 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
20a40 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
20a50 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
20a60 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
20a70 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
20a80 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
20a90 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
20aa0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
20ab0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
20ac0 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
20ad0 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
20ae0 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
20af0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
20b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20b10 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
20b20 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
20b30 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
20b40 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
20b50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
20b60 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
20b70 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
20b80 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
20b90 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
20ba0 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
20bb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20bc0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
20bd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20be0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
20bf0 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
20c00 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
20c10 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
20c20 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
20c30 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
20c40 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
20c50 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
20c60 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
20c70 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
20c80 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
20c90 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
20ca0 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
20cb0 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
20cc0 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
20cd0 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
20ce0 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76  iVar>32 ){.    v
20cf0 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66  ->expmask = 0xff
20d00 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ffffff;.  }else{
20d10 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
20d20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
20d30 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Var-1));.  }.}..
20d40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20d50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20d60 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
20d70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
20d80 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74  xt from an sqlit
20d90 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e3_vtab.zErrMsg 
20da0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
20db0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
20dc0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
20dd0 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56  malloc) into a V
20de0 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  dbe.zErrMsg (tex
20df0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
20e00 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
20e10 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
20e20 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  loc)..*/.void sq
20e30 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
20e40 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73  rrmsg(Vdbe *p, s
20e50 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
20e60 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ab){.  sqlite3 *
20e70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71  db = p->db;.  sq
20e80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20e90 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
20ea0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
20eb0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
20ec0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20ed0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20ee0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20ef0 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
20f00 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  g = 0;.}.#endif 
20f10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
20f20 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a     IRTUALTABLE */.